我对flush和close方法感到困惑.在我的代码中,我总是关闭我的FileOutputStream对象.但我想知道如果我必须在这里使用flush方法,我可以在哪里使用它?
我将编写一个重复下载4或5个文件的项目.我将编写一个方法(用于下载文件),我的方法将循环并重复下载文件.我的方法将有这样的代码.
该close方法是否调用flush,或者在关闭之前是否必须使用flush?
try {
    InputStream inputStream = con.getInputStream();
    FileOutputStream outputStream = new FileOutputStream("C:\\programs\\TRYFILE.csv");
    int bytesRead = -1;
    byte[] buffer = new byte[4096];
    while ((bytesRead = inputStream.read(buffer)) != -1) {
    outputStream.write(buffer, 0, bytesRead);
}
} catch(Exception e) {
    //
} finally {
    outputStream.close();
    inputStream.close();
}    
请注意,代码运行良好:它成功下载文件.但我不确定使用flush.
代码大部分时间都有效,但有时会引发异常.无法弄清楚是什么原因造成的.
什么是在...创建文件
/storage/emulated/0/Download/theFileName.jpg
并向其写入数据(来自sourceFile,确实存在),但新创建的文件得到"文件不存在"异常.
(它确实有uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE", and uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"清单").
File sourceFile = new File(theSourceFileFullPath);
if (sourceFile.exists()) {
    File downloadDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    String downloadPath = downloadDirectory.getPath();
    String newFilePath = (downloadPath + "/" + fileName);
    File newFile = new File(newFilePath);
    try {
        FileInputStream in = new FileInputStream(sourceFile);
        // ava.io.FileNotFoundException: 
        //     /storage/emulated/0/Download/theFileName.jpg: open failed: ENOENT (No such file or directory) 
        // exception at this line       
        FileOutputStream out = new FileOutputStream(newFile);
        //......
     } catch (Exception e) {}
}
我要求将记录写入文件,其中数据根据数字键的值写入文件位置(即搜索位置).例如,如果键为100,我可能会写入位置400.
记录由数字键和一段数据组成.记录不会很大(几个字节).但是,可能会有很多记录(数百万).
有两种可能的情况:
键是单调增加的.在这种情况下,最好的方法是使用DataOutputStream包装a 进行写入BufferedOutputStream,将缓冲区大小设置为某个数字(例如64k)以最大化I/O吞吐量.
密钥正在增加,但可能存在较大差距.在这种情况下,使用OutputStream将需要在文件的间隙中写入零.为了避免这种情况,RandomAccessFile它可以更好,因为它可以寻找空隙,如果可以寻找整个块,节省空间.缺点是,据我所知,RandomAccessFile不缓冲,因此这种方法对于顺序密钥来说会很慢.
但是,可能的情况是文件是两者兼而有之.有一系列单调增加的密钥.有一些键间隙很小,其他键间隙很大.
我正在寻找的是一个提供两全其美的解决方案.如果检测到键之间的间隙,则可能在两个I/O模式之间切换.但是,如果有一个标准的Java类可以完成这两件事,那就更好了.我见过FileImageOutputStream,但我不确定这是怎么回事.
请注意,我不是在寻找代码示例(虽然这对于演示复杂的解决方案很有帮助),但这只是一个通用策略.最好知道顺序数据的最佳大小缓冲区大小以及从顺序策略切换到随机访问策略需要的时间点(间隙大小).
编辑:
为了接受答案,我希望保证所提出的解决方案能够处理两者,而不仅仅是它可能.这需要:
此外,解决方案需要具有内存效率,因为可能会同时打开许多这些文件.
编辑2
这些文件可以在NAS上.这不是设计,而是简单地认识到在企业环境中,这种架构被大量使用,解决方案可能应该处理它(可能不是最佳的)而不是阻止它的使用.AFAIK,这不应该影响基于write()和的解决方案lseek(),但可能会使一些更深奥的解决方案失效. 
所以我的资源文件夹中有一个小的音频文件,我想打开一个InputStream写入缓冲区,然后写入临时文件,然后打开MediaPlayer播放该临时文件.问题是,当媒体播放器点击mp.Prepare()时,它不播放并且永远不会到达祝词.有没有人曾经这样做过?
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputStream str;
    try {
        str = this.getAssets().open("onestop.mid");
        Toast.makeText(this, "Successful Input Stream Opened.", Toast.LENGTH_SHORT).show();
        takeInputStream(str);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}//end on create
public void takeInputStream(InputStream stream) throws IOException
{
    //fileBeingBuffered = (FileInputStream) stream;
    //Toast.makeText(this, "sucessful stream conversion.", Toast.LENGTH_SHORT).show();
    try
    {
        convertedFile = File.createTempFile("convertedFile", ".dat", getDir("filez", 0));
        Toast.makeText(this, "Successful file and folder creation.", Toast.LENGTH_SHORT).show();
        out = new FileOutputStream(convertedFile);
        Toast.makeText(this, "Success out set as output stream.", Toast.LENGTH_SHORT).show(); …我想用一个写一个新的一行FileOutputStream; 我尝试了以下方法,但它们都没有工作:
encfileout.write('\n');
encfileout.write("\n".getbytes());
encfileout.write(System.getProperty("line.separator").getBytes());
我在我的Android APP中使用NanoHTTPD作为Web服务器,我希望在服务器端压缩一些文件并创建一个InputStream,然后使用Code A在客户端下载InputStream.
我在如何压缩和解压缩文件中读过代码B ?,但如何在Android中创建ZIP InputStream而不首先创建ZIP文件?
顺便说一句,我不认为Code C是好方法,因为它先制作ZIP文件,然后将ZIP文件转换为FileInputStream,我希望直接创建一个ZIP InputStream!
代码A.
private Response ActionDownloadSingleFile(InputStream fis)    {      
    Response response = null;
    response = newChunkedResponse(Response.Status.OK, "application/octet-stream",fis);
    response.addHeader("Content-Disposition", "attachment; filename="+"my.zip");
    return response;
}
代码B.
public static void zip(String[] files, String zipFile) throws IOException {
    BufferedInputStream origin = null;
    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)));
    try { 
        byte data[] = new byte[BUFFER_SIZE];
        for (int i = 0; i < files.length; i++) {
            FileInputStream fi = new FileInputStream(files[i]);    
            origin = new BufferedInputStream(fi, …Tim Bray的文章"安全地保存数据"给我留下了悬而未决的问题.今天,已经有一个多月了,我还没有看到任何跟进,所以我决定在这里讨论这个话题.
本文的一点是,在使用FileOutputStream时,应该调用FileDescriptor.sync()以保证安全.起初,我非常恼火,因为在我做Java的12年中,我从未见过任何Java代码进行同步.特别是因为处理文件是一件非常基本的事情.此外,FileOutputStream的标准JavaDoc从未暗示过同步(Java 1.0 - 6).经过一番研究,我认为ext4实际上可能是第一个需要同步的主流文件系统.(是否有建议使用显式同步的其他文件系统?)
我很欣赏这方面的一些一般性想法,但我也有一些具体的问题:
FileOutputStream fileOut = ctx.openFileOutput(file, Context.MODE_PRIVATE);
BufferedOutputStream out = new BufferedOutputStream(fileOut);
try {
    out.write(something);
    out.flush();
    fileOut.getFD().sync();
} finally {
    out.close();
}
我的应用程序将文件存储在其内部存储目录(/Android/data/com.mycompany.myapp/files,由getFilesDir()返回),我希望允许用户直接从他们的文件管理应用程序访问这些文件移动设备或Android文件传输桌面应用程序.
该存储选项开发人员指南说:
默认情况下,保存到内部存储的文件对应用程序是私有的,而其他应用程序无法访问它们(用户也无法访问).
"默认情况下"意味着我可以更改默认权限以允许用户访问这些文件,但我找不到任何有关如何执行此操作的文档.当我使用文件管理应用程序浏览/ Android/data目录时,目前隐藏了com.mycompany.myapp目录.
我目前正在保存这样的文件数据:
String fileName = "myfile.jpg";
String filePath = getFilesDir() + File.separator + fileName;
FileOutputStream fileStream = new FileOutputStream(filePath);
fileData.writeTo(fileStream); // fileData is a ByteArrayOutputStream
fileStream.close();
我尝试将各个文件的权限设置为全局可读,但这并未使目录可见:
FileOutputStream fileStream = this.app.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
我还检查了AndroidManifest文件的文档,但没有看到任何内容.有谁知道我怎么做到这一点?
我正在为Android平台开发.
我的应用创建了一个临时文件,只需调用:
FileOutputStream fos = openFileOutput("MY_TEMP.TXT", Mode);
它工作正常,因为我可以写它并正常阅读.
问题是,当我从应用程序退出时,我想删除此文件.我用了:
File f = new File(System.getProperty("user.dir"), "MY_TEMP.TXT");
f.delete()
但它总是返回false并且文件不会被删除.
我试过了:
File f = new File("MY_TEMP.TXT");
f.delete();
它也不起作用.
请考虑以下代码:
public static void dumpObjectToYaml(String key, Object O, String path) throws IOException
{
    Map<String, Object> data = new HashMap<>();
    data.put(key, O);
    File F = new File(path);
    F.mkdirs();
    F.createNewFile();
    //write data to File
}
此方法旨在将给定键处的给定Object O写入给定路径的YAML文件中.(如果它不存在则会被创建.)但显然主要部分仍然缺失.
现在按照SnakeYaml的文档,创建一个YAML我只需要创建一个地图并将右边的对象放入对象中,我这样做了.
但无处(至少我没有看到它)被描述如何在某个路径上创建一个yaml文件!
我发现的唯一一件事是:
"Yaml.dump(对象数据)方法接受Java对象并生成YAML文档"
public void testDump() 
{
    Map<String, Object> data = new HashMap<String, Object>();
    data.put("name", "Silenthand Olleander");
    data.put("race", "Human");
    data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
    Yaml yaml = new Yaml();
    String output = yaml.dump(data);
    System.out.println(output);
}
和
"Yaml.dump(对象数据,Writer输出)将生成的YAML文档写入指定的文件/流."
public void testDumpWriter() …