java读写同一个文件
下面的代码把BufferedWriterwriter=newBufferedWriter(newFileWriter(file));放到Stringline=reader...
下面的代码把 BufferedWriter writer = new BufferedWriter(new FileWriter(file));
放到 String line = reader.readLine(); 前面为什么就出错?
public static void test1(){
File file = new File("D:/test.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(line);
writer.flush();
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
test.txt文件中原先有以后字符,程序运行后,就没有了,如果把那两行代码换回去,就还会写回去。
或者写入到一个新文件new.text也正常,跟那两行代码顺序没关系。
这个是为什么啊? 展开
放到 String line = reader.readLine(); 前面为什么就出错?
public static void test1(){
File file = new File("D:/test.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine();
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(line);
writer.flush();
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
test.txt文件中原先有以后字符,程序运行后,就没有了,如果把那两行代码换回去,就还会写回去。
或者写入到一个新文件new.text也正常,跟那两行代码顺序没关系。
这个是为什么啊? 展开
4个回答
展开全部
读取文件有三种方式,r, w, a,读,覆盖写, 追加写, new FileReader(file)以读的方式打开了文件,两个马上就以new FileWriter(file)方式覆盖写文件,文件自然是空白的,之后你readLine读到的是null,即String line是null,然后你要writer.write(line); 即writer.write(null); 自然报空指针;
建议,如果边读边写,考虑RandomAccessFile类
建议,如果边读边写,考虑RandomAccessFile类
展开全部
在使用BufferedReader和BufferedWriter 要注意:
读不会修改文件,所以同一个file声明多个reader来读,没有问题,
但是写会修改文件,所以在对一个file绑定了writer之后,不能再读了,也不能再声明其它writer到这个file,所以可以说writer是独占的,
如果你调试一下 可以发现,在声明writer之后,file所指定的文件内容会变成空,
所以你将
BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 提到read之前会报NullPointerException
希望能给楼主帮助~~
纯手工打造,还请楼主采纳~~
下面是多个reader一个writer的例子:
package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("D:/test.txt");
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
BufferedReader reader2 = new BufferedReader(new FileReader(file));
String line = reader.readLine();
String line2 = reader2.readLine();
System.out.println(line);
System.out.println(line2);
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(line);
writer.flush();
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1. [代码][Java]代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.thread;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* 多线程下写文件
* @author owen.huang
*
*/
/**
* 将要写入文件的数据存入队列中
*/
class Creater implements Runnable{
private ConcurrentLinkedQueue<String> queue;
private String contents;
public Creater(){}
public Creater(ConcurrentLinkedQueue<String> queue, String contents){
this.queue = queue;
this.contents = contents;
}
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
queue.add(contents);
}
}
/**
* 将队列中的数据写入到文件
*/
class DealFile implements Runnable{
private FileOutputStream out;
private ConcurrentLinkedQueue<String> queue;
public DealFile(){}
public DealFile(FileOutputStream out,ConcurrentLinkedQueue<String> queue){
this.out = out;
this.queue = queue;
}
public void run() {
while(true){//循环监听
if(!queue.isEmpty()){
try {
out.write(queue.poll().getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 测试类
*/
public class TestMultipleWriteFile {
public static void main(String[] args) throws FileNotFoundException{
FileOutputStream out = new FileOutputStream(new File("F:"+ File.separator +"test.txt"),true);
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
for(int j=0;j<10;j++){
new Thread(new Creater(queue,j+"--")).start();//多线程往队列中写入数据
}
new Thread(new DealFile(out,queue)).start();//监听线程,不断从queue中读数据写入到文件中
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package com.thread;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* 多线程下写文件
* @author owen.huang
*
*/
/**
* 将要写入文件的数据存入队列中
*/
class Creater implements Runnable{
private ConcurrentLinkedQueue<String> queue;
private String contents;
public Creater(){}
public Creater(ConcurrentLinkedQueue<String> queue, String contents){
this.queue = queue;
this.contents = contents;
}
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
queue.add(contents);
}
}
/**
* 将队列中的数据写入到文件
*/
class DealFile implements Runnable{
private FileOutputStream out;
private ConcurrentLinkedQueue<String> queue;
public DealFile(){}
public DealFile(FileOutputStream out,ConcurrentLinkedQueue<String> queue){
this.out = out;
this.queue = queue;
}
public void run() {
while(true){//循环监听
if(!queue.isEmpty()){
try {
out.write(queue.poll().getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 测试类
*/
public class TestMultipleWriteFile {
public static void main(String[] args) throws FileNotFoundException{
FileOutputStream out = new FileOutputStream(new File("F:"+ File.separator +"test.txt"),true);
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
for(int j=0;j<10;j++){
new Thread(new Creater(queue,j+"--")).start();//多线程往队列中写入数据
}
new Thread(new DealFile(out,queue)).start();//监听线程,不断从queue中读数据写入到文件中
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
读写文件是两个步骤,你不能边读取边写,BufferedReader reader = new BufferedReader(new FileReader(file));
String line = reader.readLine(); //这里之后要关闭读取流后,然后再写文件。
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
String line = reader.readLine(); //这里之后要关闭读取流后,然后再写文件。
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询