Я предлагаю вам избегать BufferedReader для чтения текста InputStream: readLine использует символ eol и не подлежит восстановлению (возможно, \ n, \ r, \ n \ r, ...).Если вы хотите сохранить символы eol, вам нужно работать напрямую с InputStreamReader.Вот что я использую:
/**
* Read the open UTF-8 text InputStream to the end and close.
* @param stream the open input stream
* @return the text
*/
public static String readText(InputStream stream) {
return readText(stream, "UTF-8");
}
/**
* Read the open text InputStream to the end and close.
* @param stream the open text stream, not null
* @param charsetName the charset (e.g. UTF-8), must be valid
* @return the text
* @throws RuntimeException wrapping UnsupportedEncodingException (if charsetName invalid) or IOException (if problem reading stream)
*/
public static String readText(InputStream stream, String charsetName) {
InputStreamReader reader = null;
try {
reader = new java.io.InputStreamReader(stream, charsetName);
StringBuilder response = new StringBuilder();
char[] buffer = new char[4 * 1024];
int n = 0;
while (n >= 0) {
n = reader.read(buffer, 0, buffer.length);
if (n > 0) {
response.append(buffer, 0, n);
}
}
return response.toString();
}
catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
close(stream, reader);
}
}
/**
* Close the closeable.
* @param obj the closeable, may be null
* @return true if successfully closed
*/
public static boolean close(Closeable obj) {
if(obj != null) {
try {
obj.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
else
return false;
}
/**
* Close all the closeables
* @param objs the closeables, the list may not be null but individual items may
* @return true if all were closed successfully
*/
public static boolean close(Closeable... objs) {
boolean success = true;
for(Closeable c : objs)
success = success && close(c);
return success;
}
Есть несколько способов получить InputStream для файла, один из них - использовать один из конструкторов FileInputStream.
Запись в файл немного проще,с использованием PrintWriter:
File file = new File("C:\\file.txt");
PrintWriter writer = null;
try {
writer = new PrintWriter(new FileWriter(file, true));
writer.print("hello ");
writer.println("world");
writer.print(12.23);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
close(writer);
}