blob: 72754ddf5898428eef1f5e1ce3b3870844fb7e80 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.openapi.util.io;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.util.io.UnsyncByteArrayOutputStream;
import com.intellij.util.text.StringFactory;
import org.jetbrains.annotations.Nullable;
import java.io.*;
public class StreamUtil {
private StreamUtil() {
}
/**
* Copy stream. Use NetUtils.copyStreamContent(ProgressIndicator, ...) if you want use ProgressIndicator.
*
* @param inputStream source stream
* @param outputStream destination stream
* @return bytes copied
* @throws IOException
*/
public static int copyStreamContent(InputStream inputStream, OutputStream outputStream) throws IOException {
final byte[] buffer = new byte[10 * 1024];
int count;
int total = 0;
while ((count = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, count);
total += count;
}
return total;
}
public static byte[] loadFromStream(InputStream inputStream) throws IOException {
final UnsyncByteArrayOutputStream outputStream = new UnsyncByteArrayOutputStream();
try {
copyStreamContent(inputStream, outputStream);
}
finally {
inputStream.close();
}
return outputStream.toByteArray();
}
/**
* @deprecated depends on the default encoding, use StreamUtil#readText(java.io.InputStream, String) instead
*/
public static String readText(InputStream inputStream) throws IOException {
final byte[] data = loadFromStream(inputStream);
return new String(data);
}
public static String readText(InputStream inputStream, String encoding) throws IOException {
final byte[] data = loadFromStream(inputStream);
return new String(data, encoding);
}
public static String convertSeparators(String s) {
return StringFactory.createShared(convertSeparators(s.toCharArray()));
}
public static char[] readTextAndConvertSeparators(Reader reader) throws IOException {
char[] buffer = readText(reader);
return convertSeparators(buffer);
}
private static char[] convertSeparators(char[] buffer) {
int dst = 0;
char prev = ' ';
for (char c : buffer) {
switch (c) {
case'\r':
buffer[dst++] = '\n';
break;
case'\n':
if (prev != '\r') {
buffer[dst++] = '\n';
}
break;
default:
buffer[dst++] = c;
break;
}
prev = c;
}
if (dst == buffer.length) {
return buffer;
}
char[] result = new char[dst];
System.arraycopy(buffer, 0, result, 0, result.length);
return result;
}
public static String readTextFrom(Reader reader) throws IOException {
return StringFactory.createShared(readText(reader));
}
private static char[] readText(Reader reader) throws IOException {
CharArrayWriter writer = new CharArrayWriter();
char[] buffer = new char[2048];
while (true) {
int read = reader.read(buffer);
if (read < 0) break;
writer.write(buffer, 0, read);
}
return writer.toCharArray();
}
public static void closeStream(@Nullable Closeable stream) {
if (stream != null) {
try {
stream.close();
}
catch (IOException e) {
LOG.error(e);
}
}
}
private static final Logger LOG = Logger.getInstance(StreamUtil.class);
}