论坛首页 Java企业应用论坛

读取文件的问题

浏览 4271 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-21  
我写了一个读取txt文件的程序,并插入excel文件中,代码如下:
//把数据写入xls文件中
public int ReadFile_xls(String fileName, String newFileName, String sign)
throws IOException, WriteException, ArrayIndexOutOfBoundsException{

// 初始化工作
FileReader fr = new FileReader(fileName);

WritableWorkbook wwb = null;

FileOutputStream out = null; 
        File outfile = new File(newFileName);
       try {
out = new FileOutputStream(outfile, false);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
//创建新的excel文件
wwb = Workbook.createWorkbook(out);

// 创建工作表
WritableSheet ws = wwb.createSheet("Sheet1", 0);
// 逐行添加数据
br = new BufferedReader(fr);
// System.out.println(br.readLine());
int i = 1;
            // 一次读入一行,直到读入null为文件结束
// while(br.ready()){
            while (br.read() != -1) {
//            while(br.readLine() != null){
// for(String   line   =   br.readLine();   line   !=   null;   line   =   br.readLine())   { 
            System.out.println(br.readLine());
readoneline = br.readLine();
strt = ReadFileNum(readoneline, sign);
for (int j = 1; j <= strt.length; j++) {
//System.out.println(strt[j-1]);
Label label = new Label(j-1, i, strt[j-1]);
ws.addCell(label);
}
i++;
}
            br.close();
            fr.close();
} catch (Exception e) {
// logger.error("export excel error:" + e);
e.printStackTrace();
} finally {
if(br != null){
br.close();
}
if(fr != null){
fr.close();
}
// br.close();
if (wwb != null) {
wwb.write();
wwb.close();
fileOK = 1;
}

}
return fileOK;
}


我用了四种BufferedReader下的方法去循环读取内容,可是都出错,要不就是少了几行的内容,要不就是每行的第一个字母丢失,就没有完全正确的,哪位大虾可以给我一点帮助啊,谢谢了啊!
   发表时间:2011-04-21   最后修改:2011-04-21
读取流的操作会导致流中的游标向后移动
例如你while的条件中的while(br.read()!=-1)
标准输出中的system.out.println(br.readLine())都导致了游标向后移动
你真正使用时的readLine实际上已经不是你标准输出中的readLine了
不知这样解释你是否明白,
正确的用法是这样的


 String line = null;
while((line=br.readLine)!=null) {
    sysout(line)
    ...
    // do ur code
}
0 请登录后投票
   发表时间:2011-04-21  
Dark-Mraz 写道
读取流的操作会导致流中的游标向后移动
例如你while的条件中的while(br.read()!=-1)
标准输出中的system.out.println(br.readLine())都导致了游标向后移动
你真正使用时的readLine实际上已经不是你标准输出中的readLine了
不知这样解释你是否明白,
正确的用法是这样的


 String line = null;
while((line=br.readLine)!=null) {
    sysout(line)
    ...
    // do ur code
}


你回答的我明白,我下边也有用到你写的方法,但是用你写的方法会丢失行的内容,也就是说,如果一个txt文件有十四行内容,用你写的这种方法虽然不会丢失每行的首字母,但是可以读取出来写入到excel文件中的只有七行或者不到14行的代码。
0 请登录后投票
   发表时间:2011-04-21  
dragonlin 写道
我写了一个读取txt文件的程序,并插入excel文件中,代码如下:
//把数据写入xls文件中
public int ReadFile_xls(String fileName, String newFileName, String sign)
throws IOException, WriteException, ArrayIndexOutOfBoundsException{

// 初始化工作
FileReader fr = new FileReader(fileName);

WritableWorkbook wwb = null;

FileOutputStream out = null; 
        File outfile = new File(newFileName);
       try {
out = new FileOutputStream(outfile, false);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
//创建新的excel文件
wwb = Workbook.createWorkbook(out);

// 创建工作表
WritableSheet ws = wwb.createSheet("Sheet1", 0);
// 逐行添加数据
br = new BufferedReader(fr);
// System.out.println(br.readLine());
int i = 1;
            // 一次读入一行,直到读入null为文件结束
// while(br.ready()){
            while (br.read() != -1) {
//            while(br.readLine() != null){
// for(String   line   =   br.readLine();   line   !=   null;   line   =   br.readLine())   { 
            System.out.println(br.readLine());
readoneline = br.readLine();
strt = ReadFileNum(readoneline, sign);
for (int j = 1; j <= strt.length; j++) {
//System.out.println(strt[j-1]);
Label label = new Label(j-1, i, strt[j-1]);
ws.addCell(label);
}
i++;
}
            br.close();
            fr.close();
} catch (Exception e) {
// logger.error("export excel error:" + e);
e.printStackTrace();
} finally {
if(br != null){
br.close();
}
if(fr != null){
fr.close();
}
// br.close();
if (wwb != null) {
wwb.write();
wwb.close();
fileOK = 1;
}

}
return fileOK;
}


我用了四种BufferedReader下的方法去循环读取内容,可是都出错,要不就是少了几行的内容,要不就是每行的第一个字母丢失,就没有完全正确的,哪位大虾可以给我一点帮助啊,谢谢了啊!


你在br.read()那把第一个字母读过了  当然就丢失首字母了

read和readline都不能单纯的用作while判断  需要先写入某个变量  然后根据变量判断才行
0 请登录后投票
   发表时间:2011-04-22  
dragonlin 写道
Dark-Mraz 写道
读取流的操作会导致流中的游标向后移动
例如你while的条件中的while(br.read()!=-1)
标准输出中的system.out.println(br.readLine())都导致了游标向后移动
你真正使用时的readLine实际上已经不是你标准输出中的readLine了
不知这样解释你是否明白,
正确的用法是这样的


 String line = null;
while((line=br.readLine)!=null) {
    sysout(line)
    ...
    // do ur code
}


你回答的我明白,我下边也有用到你写的方法,但是用你写的方法会丢失行的内容,也就是说,如果一个txt文件有十四行内容,用你写的这种方法虽然不会丢失每行的首字母,但是可以读取出来写入到excel文件中的只有七行或者不到14行的代码。

这是因为你后面还有一行readoneline = br.readLine();
只要你调用了 br.readLine() 就会导致你读取的游标下移一行,这个时候实际上你的readoneline 已经是line的下一行了.
所以请把你的readoneline = br.readLine();
strt = ReadFileNum(readoneline, sign);
也改成strt = ReadFileNum(line, sign);
0 请登录后投票
   发表时间:2011-04-22  
            while (br.read() != -1) { 
//            while(br.readLine() != null){ 
// for(String   line   =   br.readLine();   line   !=   null;   line   =   br.readLine())   {  
            System.out.println(br.readLine()); 
readoneline = br.readLine(); 

楼上说得很对啊,BufferedReader readLine()每call一次就下移一行
应该在while((line=br.readLine())!=null)
将System.out.println(br.readLine()); 变成System.out.println(line);
0 请登录后投票
   发表时间:2011-04-24  
文本文件进行readline读出后的文本是不带\r\n换行的。

String line="";
while((line=r.readline())!=null)
{
readline+="\r\n";
}
行数就对了
如果是linux添加\n即可
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics