文本文件的不完整副本
Incomplete copy of a text file
这是我的输入文件:
This is a file test.
please take
notice of it.
Peace.
这是输出:
This is a file test.
please take
notice of
我不明白为什么它会停止 "it.",但它会显示 "test." 这个词。
这是代码:
import java.io.*;
import java.util.*;
public class FileTest {
public static void readFile() throws Throwable {
File _output = new File("output.txt");
FileWriter _filewr = new FileWriter(_output);
BufferedWriter _buffwrt = new BufferedWriter(_filewr);
FileInputStream f = new FileInputStream(
"C:\Users\Diana\Desktop\FileTest\test.txt.txt");
BufferedReader _buffer = new BufferedReader(new InputStreamReader(f));
String _str = _buffer.readLine();
while (_str != null) {
String[] _vect = _str.split(" ");
int i;
for (i = 0; i < _vect.length; i++) {
if (_vect[i].contains(".")) {
_buffwrt.write(_vect[i] + " ");
break;
}
else
_buffwrt.write(_vect[i] + " ");
_buffwrt.flush();
}
_str = _buffer.readLine();
}
}
public static void main(String[] args) throws Throwable {
readFile();
}
}
在循环外使用另一个 _buffwrt.flush();
来清除所有剩余的东西,不要忘记最后的 _buffwrt.close();
更新
@Svetlin Zarev 提到了一个好点,最后只有 _buffwrt.close();
就足以冲洗掉剩下的任何东西
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html#close%28%29
基本答案是,break
语句跳出循环,这是您想要的,但它也跳过了 _buffwrt.flush();
语句。因为您没有正确关闭输出流,缓冲的内容只是被丢弃了。
虽然您可以放入更多 flush
语句,但这有点违背 BufferedWriter
的目的,相反,您应该简单地更好地管理您的资源并确保它们在您关闭时关闭完成了它们,在这种情况下,这将在关闭资源之前刷新缓冲区。
File _output = new File("output.txt");
try (BufferedWriter _buffwrt = new BufferedWriter(new FileWriter(_output))) {
try (BufferedReader _buffer = new BufferedReader(new FileReader("test.txt"))) {
String _str = _buffer.readLine();
while (_str != null) {
String[] _vect = _str.split(" ");
int i;
for (i = 0; i < _vect.length; i++) {
if (_vect[i].contains(".")) {
System.out.println("1 " + _vect[i]);
_buffwrt.write(_vect[i] + " ");
break;
} else {
System.out.println("2 " + _vect[i]);
_buffwrt.write(_vect[i] + " ");
}
}
_str = _buffer.readLine();
}
}
} catch (IOException exp) {
exp.printStackTrace();
}
查看 The try-with-resources Statement 了解更多详情
这是我的输入文件:
This is a file test.
please take
notice of it.
Peace.
这是输出:
This is a file test.
please take
notice of
我不明白为什么它会停止 "it.",但它会显示 "test." 这个词。 这是代码:
import java.io.*;
import java.util.*;
public class FileTest {
public static void readFile() throws Throwable {
File _output = new File("output.txt");
FileWriter _filewr = new FileWriter(_output);
BufferedWriter _buffwrt = new BufferedWriter(_filewr);
FileInputStream f = new FileInputStream(
"C:\Users\Diana\Desktop\FileTest\test.txt.txt");
BufferedReader _buffer = new BufferedReader(new InputStreamReader(f));
String _str = _buffer.readLine();
while (_str != null) {
String[] _vect = _str.split(" ");
int i;
for (i = 0; i < _vect.length; i++) {
if (_vect[i].contains(".")) {
_buffwrt.write(_vect[i] + " ");
break;
}
else
_buffwrt.write(_vect[i] + " ");
_buffwrt.flush();
}
_str = _buffer.readLine();
}
}
public static void main(String[] args) throws Throwable {
readFile();
}
}
在循环外使用另一个 _buffwrt.flush();
来清除所有剩余的东西,不要忘记最后的 _buffwrt.close();
更新
@Svetlin Zarev 提到了一个好点,最后只有 _buffwrt.close();
就足以冲洗掉剩下的任何东西
http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html#close%28%29
基本答案是,break
语句跳出循环,这是您想要的,但它也跳过了 _buffwrt.flush();
语句。因为您没有正确关闭输出流,缓冲的内容只是被丢弃了。
虽然您可以放入更多 flush
语句,但这有点违背 BufferedWriter
的目的,相反,您应该简单地更好地管理您的资源并确保它们在您关闭时关闭完成了它们,在这种情况下,这将在关闭资源之前刷新缓冲区。
File _output = new File("output.txt");
try (BufferedWriter _buffwrt = new BufferedWriter(new FileWriter(_output))) {
try (BufferedReader _buffer = new BufferedReader(new FileReader("test.txt"))) {
String _str = _buffer.readLine();
while (_str != null) {
String[] _vect = _str.split(" ");
int i;
for (i = 0; i < _vect.length; i++) {
if (_vect[i].contains(".")) {
System.out.println("1 " + _vect[i]);
_buffwrt.write(_vect[i] + " ");
break;
} else {
System.out.println("2 " + _vect[i]);
_buffwrt.write(_vect[i] + " ");
}
}
_str = _buffer.readLine();
}
}
} catch (IOException exp) {
exp.printStackTrace();
}
查看 The try-with-resources Statement 了解更多详情