0

我在 Google App Engine 平台上的 JSF 程序有问题。当我读到GAE 不支持FileOutputStream类时,我几乎完成了在 Java EE 中实现聊天应用程序。通过这个类对象,我创建文件,在其中写入聊天消息,并通过脚本在 index.xhtml 网站上加载和刷新该文件。

我需要帮助,因为我不知道我可以替换哪个类FileOutputStream来完成这个应用程序。我在 Python 中找到了示例,所以我知道这是可能的,但是如何在 Java 中实现呢?

我将不胜感激任何帮助。

下面我用FileOutputSream操作粘贴一段 ChatBean 类:

@Stateful
@ApplicationScoped
@ManagedBean(name="Chat")
public class ChatBean {

    private List<String> users = new ArrayList<String>();
    private String newUser;
    FileOutputStream chatHtmlBufferWriter;

    public ChatBean () throws IOException {
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String chatHtmlPath = ctx.getRealPath("/") + "chat";
        try {
            this.chatHtmlBufferWriter = new FileOutputStream(chatHtmlPath);  
            this.chatHtmlBufferWriter.write("Start chatu ąęć. <br />".getBytes("UTF-8"));
        } catch (IOException ex) {
            this.chatHtmlBufferWriter.close();
            throw ex;
        }

        users.add("Admin");
    }

    @PreDestroy
    public void closeFileBuffor() throws Exception {
        this.chatHtmlBufferWriter.close();
    }

    public String addMessage(String msg) throws IOException {
        this.chatHtmlBufferWriter.write(msg.getBytes("UTF-8"));    
        FacesContext.getCurrentInstance().getExternalContext().redirect("index.xhtml");
        return "index"; 
    } 
...
}

index.xhtml 文件中的脚本:

<script src="http://code.jquery.com/jquery-latest.js"></script>
            <script>
                var currPos = 0;
                var loadChat = function() {
                    $("#chatForm\\:chatbox").load('chat');
                    currPos = $(".chat")[0].scrollHeight;
                    $(".chat").scrollTop(currPos);
                }
                var scrollChat = function() {
                    $("#chatForm\\:chatbox").load('chat');
                    $(".chat").scrollTop(currPos);
                }
                var currPos;

                $(document).ready(function() {
                    $("#chatForm\\:chatbox").load('chat', function(){
                        loadChat();
                    });
                    var refreshId = setInterval(function() {
                        scrollChat();
                    }, 1000);
                    $.ajaxSetup({ cache: false });                    
                    $("#chatForm\\:chatbox").scroll(function() {
                        currPos = $(".chat").scrollTop();
                    });
                });
            </script>
4

1 回答 1

1

基本上,您不能直接写入文件系统(尽管您可以读取)。

您将需要使用现有的 GAE 存储 API 之一,例如具有File like API的 blobstore 。存储数据页面上详细介绍了其他选项。

但是,我不确定您是否正确地考虑了这一点。您只想创建一个返回当前消息并由您的脚本调用的 GET 方法。消息永远不会被写入文件。首先,您可以将消息存储在内存中。我怀疑您链接到的教程也是如此。

(更新:我最初说 FileOutputStream 在白名单中,但我正在查看FilterOutputStream。哎呀。)

于 2012-08-26T08:59:34.187 回答