请查看以下代码
import java.io.*;
public class CSVConverter
{
private File csvFile;
private BufferedReader reader;
private StringBuffer strBuffer;
private BufferedWriter writer;
int startNumber = 0;
private String strString[];
public CSVConverter(String location, int startNumber)
{
csvFile = new File(location);
strBuffer = new StringBuffer("");
this.startNumber = startNumber;
//Read
try
{
reader = new BufferedReader(new FileReader(csvFile));
String line = "";
while((line=reader.readLine())!=null)
{
String[] array = line.split(",");
String inputQuery = "insertQuery["+startNumber+"] = \"insert into WordList_Table ('Engl','Port','EnglishH','PortugueseH','Numbe','NumberOf','NumberOfTime','NumberOfTimesPor')values('"+array[0]+"','"+array[2]+"','"+array[1]+"','"+array[3]+"',0,0,0,0)\"";
strBuffer.append(inputQuery+";"+"\r\n");
startNumber++;
}
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println(strBuffer.toString()); …
Run Code Online (Sandbox Code Playgroud) 我有一个Java程序,它从文件中逐行读取一些文本,并将新文本写入输出文件.但是BufferedWriter
,在程序完成后,我写入的所有文本都不会出现在输出文件中.这是为什么?
详细信息:程序采用CSV文本文档并将其转换为SQL命令以将数据插入表中.文本文件超过10000行,类似于以下内容:
2007,10,9,1,1,1006134,19423882
Run Code Online (Sandbox Code Playgroud)
该程序似乎工作正常,除了它只是在文件中随机停止创建一个新的SQL语句已打印到SQL文件中.它看起来像:
insert into nyccrash values (2007, 1, 2, 1, 4, 1033092, 259916);
insert into nyccrash values (2007, 1, 1, 1, 1, 1020246, 197687);
insert into nyccrash values (2007, 10, 9, 1
Run Code Online (Sandbox Code Playgroud)
这在大约10000行之后发生,但在文件结束之前有几百行.中断发生的地方是a 1
和a 之间,
.但是,这些字符看起来并不重要,因为如果我将最后1
一个更改为42
写入新文件4
,那就是从该整数中删除2.所以看起来读者或作者必须在写完/读取一定数量后才会死亡.
我的Java代码如下:
import java.io.*;
public class InsertCrashData
{
public static void main (String args[])
{
try
{
//Open the input file.
FileReader istream = new FileReader("nyccrash.txt");
BufferedReader in = new BufferedReader(istream);
//Open the …
Run Code Online (Sandbox Code Playgroud) 我想将文件results.txt写入我机器上的特定目录(Z:\结果是准确的).如何指定BufferedWriter/FileWriter的目录?
目前,它成功写入文件,但是写入源代码所在的目录.谢谢
public void writefile(){
try{
Writer output = null;
File file = new File("results.txt");
output = new BufferedWriter(new FileWriter(file));
for(int i=0; i<100; i++){
//CODE TO FETCH RESULTS AND WRITE FILE
}
output.close();
System.out.println("File has been written");
}catch(Exception e){
System.out.println("Could not create file");
}
}
Run Code Online (Sandbox Code Playgroud) 好的,我正在学习I/O,我在其中一张幻灯片中找到了以下代码.有谁可以解释为什么需要有FileWrite,BufferedWriter和PrintWriter?我知道BufferedWriter是缓冲输出并将其全部放在一起,但为什么他们会使用FileWriter和PrintWriter?他们几乎没有做同样的错误处理等一点点差异?
还有他们为什么要传递bw
给他们PrintWriter
?
FileWriter fw = new FileWriter (file);
BufferedWriter bw = new BufferedWriter (fw);
PrintWriter outFile = new PrintWriter (bw);
Run Code Online (Sandbox Code Playgroud) 考虑一下BufferedReader,如下所示:
writer = new BufferedWriter(new FileWriter(new File("File.txt"), true));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,在应用程序的结束,我关闭writer
与writer.close()
这还够吗?创建的FileWriter new FileWriter(new File("File.txt"), true)
不需要关闭吗?
我有一个Socket,我通过BufferedReaders和BufferedWriters阅读和写入.我不确定哪些操作可以通过单独的线程完成.我猜想同时从两个不同的线程写入套接字是个坏主意.与从两个不同的线程同时读取套接字相同.在另一个线程上写入时在一个线程上读取怎么样?
我问,因为我想在读取时长时间阻塞一个线程,因为它等待更多数据,但在这个等待期间我也偶尔会在套接字上发送数据.我不清楚这是否是线程安全的,或者我是否应该在写入之前取消读取(这会很烦人).
BufferedWriter
其他地方的默认缓冲区大小为8k .为什么用8k?缓冲区大小是否会提高性能?
对于枪支Java程序员来说,这可能是非常简单的,但是我(Java的相对新手)无法找到一个如何做到的简单,直接的例子,这意味着我将使用自我回答选项来希望能防止其他人经历类似的挫折.
我需要将错误信息输出到一个简单的文本文件.这些操作不常见且很小(有时根本不需要),因此没有必要为文件打开流; 文件在一个操作中打开,写入和关闭.
与我遇到的其他"追加"问题不同,这个问题要求在第一次调用Java应用程序运行时的方法时创建文件.该文件在此之前不存在.
原始代码是:
Path pathOfLog = Paths.get(gsOutputPathUsed + gsOutputFileName);
Charset charSetOfLog = Charset.forName("US-ASCII");
bwOfLog = Files.newBufferedWriter(pathOfLog, charSetOfLog);
bwOfLog.append(stringToWrite, 0, stringToWrite.length());
iReturn = stringToWrite.length();
bwOfLog.newLine();
bwOfLog.close();
Run Code Online (Sandbox Code Playgroud)
以gs开头的变量是显示输出位置的预填充字符串变量,stringToWrite是传入的参数.
所以.append方法应该足以表明我想要追加内容,对吧?
但事实并非如此; 每次调用该过程时,文件都只包含最近一次调用的字符串.
我正在使用java中的缓冲编写器编写csv文件.我的数据写得正确,但我希望有不同的数据来源列,目前它正在将每个日期实例写入一行但不按列分隔.
代码是
DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
File file = new File( dirName + "\\"+ df.format(new Date()) +"_Statistics.csv");
if ( !file.exists() )
file.createNewFile();
FileWriter fw = new FileWriter(file);
writer = new BufferedWriter( fw );
writer.write("Message Source");
writer.write("Message Name");
writer.write("Component");
writer.write("Occurance");
writer.write("Message Payload");
writer.write("Bandwidth (Payload)");
writer.write("Message Payload with Header");
writer.write("Bandwidth (Payload with Header)");
writer.newLine();
for (Signal signal : messages) {
writer.write(signal.getSource());
writer.write(signal.getName());
writer.write(signal.getComponent());
writer.write(Integer.toString(signal.getOccurance()));
writer.write(Integer.toString(signal.getSize()));
writer.write(Float.toString(signal.getBandwidth()));
writer.write(Integer.toString(signal.getSizewithHeader()));
writer.write(Float.toString(signal.getBandwidthWithHeader()));
writer.newLine();
}
writer.flush();
writer.close();
fw.close();
Run Code Online (Sandbox Code Playgroud)
有没有办法将数据列分开,以便它可以正确读取?
编辑
我没有使用缓冲编写器,而是使用CSVReader
java库.http://www.csvreader.com/java_csv.php
现在的代码是
DateFormat …
Run Code Online (Sandbox Code Playgroud) 我一直在使用Java的BufferedWriter来写一个文件来解析一些输入.但是,当我打开文件后,似乎添加了空字符.我尝试将编码指定为"US-ASCII"和"UTF8",但我得到了相同的结果.这是我的代码片段:
Scanner fileScanner = new Scanner(original);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "US-ASCII"));
while(fileScanner.hasNextLine())
{
String next = fileScanner.nextLine();
next = next.replaceAll(".*\\x0C", ""); //remove up to ^L
out.write(next);
out.newLine();
}
out.flush();
out.close();
Run Code Online (Sandbox Code Playgroud)
也许问题甚至不是BufferedWriter?
我把它缩小到这个代码块,因为如果我将它注释掉,输出文件中就没有空字符.如果我在VIM中进行正则表达式替换,则该文件为null-character free(:%s /.*^ L // g).
如果您需要更多信息,请与我们联系.
谢谢!
编辑: 正常线的hexdump看起来像:0000000 5349 2a41 3030 202a
但是当运行此代码时,hexdump看起来像:0000000 5330 2a49 4130 202a
我不确定为什么事情变得混乱了.
编辑: 此外,即使文件与正则表达式不匹配并贯穿该代码块,它也会出现空字符.
编辑: 这是差异的前几行的十六进制:http: //pastie.org/pastes/8964701/text
命令是:diff -y testfile.hexdump expectedoutput.hexdump
其余的线条与最后两条线条不同.
bufferedwriter ×10
java ×9
file ×3
filewriter ×2
ansi ×1
buffer ×1
csv ×1
directory ×1
file-io ×1
io ×1
performance ×1
printwriter ×1
sockets ×1
stream ×1