GAE上的Java聊天应用程序,将消息写入文件时出现问题

时间:2012-08-26 08:57:44

标签: java google-app-engine jsf java-ee-6

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

我需要帮助,因为我不知道哪个类可以替换 FileOutputStream 来完成此应用程序。我发现example in 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>

1 个答案:

答案 0 :(得分:1)

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

您需要使用现有的GAE存储API之一,例如具有File like API的blobstore。其他选项详见Storing Data page

然而,我不确定你是否正确地考虑过这个问题;您只想创建一个返回当前消息的GET方法,并由您的脚本调用。消息永远不会写入文件。首先,您可以将消息存储在内存中。我怀疑你链接的教程是一样的。

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