java - 使用java创建客户端文件

标签 java javascript html

我正在尝试创建一个在客户端创建文件的项目。我已经完成了创建文件的编码。但它显然将在服务器端创建。任何人都可以帮助做到这一点。下面是我完成的代码..

    File file = new File("d:/file.txt");
        try {

            String content = "This is the content to write into file";
            if (!file.exists()) {
                file.createNewFile();
            }
            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
            System.out.println("Done");
        } catch (IOException e) {
            e.printStackTrace();
        }

我还尝试使用 filesysapi 创建文件,这是使用 HTML 和 javascript 完成的。但我收到“错误:SECURITY_ERR”

最佳答案

不管大家怎么说,您可以通过 javascript 创建客户端文件。它是文件系统的沙盒部分,通过 HTML5 的文件系统 API 完成。

但是,我猜你的 SECURITY_ERR 可能是因为你在浏览器中通过 File://PATH_TO_HTML_PAGE 打开一个带有目标 javascript 的 html 页面。文件系统 API 将无法工作,除非您从服务器获取 html/javascript/css(例如 locahost:8080/test.html - Netbeans 有一些选项可以非常轻松地运行 glassfish/server 实例如果您没有使用服务器的经验,则在您的计算机本地。)。

2014 年 1 月 31 日更新an article on the File-System API 中找到了这个, 这为我证实了上面的段落:

You may need the --allow-file-access-from-files flag if you're debugging your app from file://. Not using these flags will result in a SECURITY_ERR or QUOTA_EXCEEDED_ERR FileError.

结束更新

就是说,在之前关于 different question you asked and I answered 的评论中,您使用的是 TEMPORARY 存储。我使用 PERSISTENT 因为它更可靠,浏览器会显示一条消息,请求允许在目标机器上本地存储数据。以下是我在过去几年中如何在客户端机器上本地制作文件以进行持久数据存储。据我所知,这只适用于少数浏览器,我使用谷歌浏览器 - 以下绝对适用于谷歌浏览器。

以下是 javascript,需要在外部脚本或 script 标记内。

//this is a callback function that gets passed to your request for the file-System.
var onInitFs = function(fileSys){
    //fileSystem is a global variable
    fileSystem = fileSys;
    //once you have access to the fileSystem api, then you can create a file locally
    makeAFile();
    makeAndWriteContent();
};
var errorHandler = function(e){console.log('Error', e);};

//request 1 GB memory in a quota request
//note the internal callback `function(grantedBytes){...}` which makes the actual 
//request for the Filesystem, on success `onInitFs` is called. 
///on error the `errorHandler` is called
navigator.webkitPersistentStorage.requestQuota(1024*1024*1024*1, function(grantedBytes) {
    window.webkitRequestFileSystem(PERSISTENT, grantedBytes, onInitFs, errorHandler); 
}, errorHandler);

//this method will only work once the fileSystem variable has been initialized
function makeAFile(){
    var callbackFunctionOnSuccess = function(){console.log("created new file")}
    fileSystem.root.getFile("test.txt", {
        create: true
    }, callbackFunctionOnSuccess, function(error){console.log(error);});
}

function makeAndWriteContent(){
    //this is going to be passed as a callback function, to be executed after
    //contents are written to the test2.txt file.
    var readFile = function(){
       fileSystem.root.getFile("test2.txt", {create: false}, function(fileEntry) {
           fileEntry.file(function(file) {
              var reader = new FileReader();
              reader.onloadend = function(e) {
                console.log(this.result);
              };
              reader.readAsText(file);
           }, function(error){console.log(error);});
         }, function(error){console.log(error);});
    }


    fileSystem.root.getFile("test2.txt", {
        create: true
    }, function(fileEntry) {
        fileEntry.createWriter(function(writer) {
            writer.onwriteend = function(e) {
                writer.onwriteend = function(e){
                    //now, we will read back what we wrote.
                    readFile();
                }
                writer.onerror = function(e3){console.log(e3);
                }
                var blob = new Blob(["Hello World"]);
                writer.write(blob);
            };
            writer.onerror = function(e3) {console.log(e3);};
            //make sure our target file is empty before writing to it.
            writer.truncate(0);
        }, errorHandler);
    }, errorHandler);
}

要记住的一件事是文件系统 API 是异步的,因此您必须习惯使用回调函数。如果您尝试在实例化之前访问文件系统 API,或者如果您尝试在文件准备好之前访问它们,您也会遇到错误。回调函数必不可少。

关于java - 使用java创建客户端文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21376738/

相关文章:

java - Java 中的首选项

javascript - jQuery .insertAfter 仅使用类选择器一次

Java Swing完全圆角的JButton(圆圈外的区域无法点击也看不到)

java - 如何保证camel记录的是ASCII文本而不是小数?

java - Snowflake Java UDF 无法返回 float 组?

javascript - 计算列表中隐藏的下一行元素

javascript - Canvas - 无法读取未定义的属性 'x'

php - 更改 magento 下拉菜单中的文本颜色?

html - 仅使用 CSS Flexbox 控制垂直堆叠元素的顺序

javascript - 单击一个按钮可更改多个跨度项