Java 创建文件输出流的时候报错

本文介绍了一个使用Java进行CSV文件读写操作时遇到的问题及解决办法。在利用FileOutputStream进行文件输出时出现异常,原因是程序运行期间CSV文件被外部程序占用。文章详细解释了解决方案并提供了完整的代码示例。

问题:

在项目中我们用Apache的Mahout进行协同过滤的推荐,需要打开一个csv文件并将数据库里的用户数据存入其中,从而进行书籍推荐。但是在创建文件输出流的时候却捕获到了一个异常- -·

package MicrosoftImageCup;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;


public class CSVUtils {

    /**
     * 导入
     * 
     * @param file csv文件(路径+文件名),csv文件不存在会自动创建
     * @param dataList 数据
     * @return
     */
    public static boolean importCsv(File file, List<String> dataList){
        boolean isSucess=false;
        FileOutputStream out=null;
        OutputStreamWriter osw=null;
        BufferedWriter bw=null;
        try {
            out = new FileOutputStream(file);
            osw = new OutputStreamWriter(out);
            bw =new BufferedWriter(osw);
            if(dataList!=null && !dataList.isEmpty()){
                for(String data : dataList){
                    bw.append(data).append("\r");
                }
            }

            isSucess=true;
        } catch (Exception e) {

            isSucess=false;
        }finally{

            if(bw!=null){
                try {
                    bw.close();
                    bw=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
            if(osw!=null){
                try {
                    osw.close();
                    osw=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
            if(out!=null){
                try {
                    out.close();
                    out=null;
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            }
        }

        return isSucess;
    }

    /**
     * 导出
     * 
     * @param file csv文件(路径+文件)
     * @return
     */
    public static List<String> exportCsv(File file){
        List<String> dataList=new ArrayList<String>();

        BufferedReader br=null;
        try { 
            br = new BufferedReader(new FileReader(file));
            String line = ""; 
            while ((line = br.readLine()) != null) { 
                dataList.add(line);
            }
        }catch (Exception e) {

        }finally{
            if(br!=null){
                try {
                    br.close();
                    br=null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return dataList;
    }
}

out = new FileOutputStream(file);

这句的时候报了异常

原因:

原来是我在运行的时候,那个CSV文件是在程序外大开着的。。。。
= = 所以才报了错。。。

<think>嗯,用户问的是文件输入输出流是否会默认创建文件。我需要先回忆一下不同编程语言中的情况。记得之前学过Java和C++的文件操作,可能得分开来说。 首先,Java里的FileOutputStream和FileWriter,这两个类是不是会创建文件呢?根据引用[2]和引用[4],JavaFileInputStream是用来读取文件的,如果文件不存在会抛出异常。而FileOutputStream在写入时,如果文件不存在,应该会创建文件。比如引用[2]中的例子,创建FileInputStream时如果文件不存在会报错,但FileOutputStream应该不同。同样,FileWriter的例子中,如果指定的文件不存在,应该会新建,比如demo.txt可能被创建。 然后是C++的情况,引用[1]和引用[3]提到,使用ofstream或者fstream打开文件进行写操作时,如果文件不存在,通常会创建文件。比如ofstream在打开文件时,默认模式可能会创建,而ifstream只是读取,不会创建。 不过用户可能还想知道其他语言的情况,但引用里只提到了Java和C++。所以需要明确回答这两个语言的情况,同时指出是否默认创建取决于语言和打开模式。 另外,用户的问题可能涉及到是否在构造函数调用时就创建文件,比如在Java中,FileOutputStream的构造函数如果以写入模式打开,就会创建文件。而C++中,当使用ofstream并指定写入模式时,同样会创建。但读取的时候不会,比如ifstream或者FileInputStream。 还需要注意不同的打开模式,比如追加模式是否会创建,或者覆盖模式。但用户的问题是默认情况,也就是基本的构造函数调用是否创建。比如JavaFileOutputStream默认会创建,而C++的ofstream默认也会。但如果是读取模式,则不会,反而会报错。 所以总结起来,应该分语言回答,Java输出流会默认创建,输入流不会;C++的输出流会,输入流不会。同时需要提到是否抛出异常,比如JavaFileInputStream如果文件不存在会抛出FileNotFoundException,而输出流创建文件。 还要检查引用内容是否支持这些结论,比如引用[2]中的FileInputStream例子,如果文件不存在会进入catch块,而FileOutputStream可能在写入时创建。引用[4]中的FileWriter例子,创建时如果文件不存在会新建。 最后,用户可能需要示例代码来理解,比如Java输出流创建文件的代码,和C++中的例子。同时相关问题可以涉及如何避免覆盖,或者读取时检查文件是否存在。</think>关于文件输入输出流是否默认创建文件的问题,需要根据编程语言和具体实现来分析: ### 一、Java语言实现 1. **输出流默认创建文件** - $FileOutputStream$ 和 $FileWriter$ 在写入文件时,**若文件不存在会自动创建文件**。例如: ```java FileOutputStream fos = new FileOutputStream("output.txt"); // 文件不存在时会自动创建 ``` 引用[2]中的示例也验证了输出流的这一特性[^2]。 2. **输入流不会创建文件** - $FileInputStream$ 和 $FileReader$ **仅用于读取**,若文件不存在会抛出 $FileNotFoundException$。如引用[2]中的代码明确需要文件存在才能读取[^2]。 ### 二、C++语言实现 1. **输出流默认创建文件** - 使用 $ofstream$ 或 $fstream$ 打开文件进行**写入操作**时,若文件不存在会自动创建: ```cpp ofstream outfile("output.txt"); // 自动创建文件 ``` 引用[1]和引用[3]均指出输出流的这一特性[^1][^3]。 2. **输入流不会创建文件** - $ifstream$ **仅用于读取**,若文件不存在会触发错误状态(可通过 $good()$ 方法检测)[^3]。 ### 三、关键差异总结 | 操作类型 | Java输出流 | Java输入流 | C++输出流 | C++输入流 | |----------------|------------|------------|-----------|-----------| | **文件不存在时** | 自动创建 | 抛出异常 | 自动创建 | 报错状态 | ### 四、扩展说明 1. **覆盖与追加模式** - 默认情况下输出流会**覆盖原有文件内容**,若需追加内容需显式设置模式(如Java的构造参数或C++的 $ios::app$ 标志) 2. **编码与平台适配** - Java的 $FileWriter$ 使用平台默认编码(如引用[4]所述),而C++需手动处理编码问题[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值