簡體   English   中英

HTTP手冊客戶端未正確寫入磁盤JAVA

[英]HTTP manual Client not writing to disk properly JAVA

我試圖建立一個手動HTTP客戶端(使用套接字)以及緩存,但我似乎無法弄清楚為什么文件沒有正確保存到磁盤上。 它對於HTML文件非常有效,但是對於其他不是基於文本的.gif文件類型似乎無法工作。 誰能告訴我為什么? 一般來說,我對HTTP協議和Socket編程還是比較陌生的。

循環以獲取響應。

    InputStream inputStream = socket.getInputStream();
    PrintWriter outputStream = new PrintWriter(socket.getOutputStream());

    ArrayList<Byte> dataIn = new ArrayList<Byte>();
    ArrayList<String> stringData = new ArrayList<String>();

    //Indices to show the location of certain lines in arrayList
    int blankIndex = 8;
    int lastModIndex = 0;

    int byteBlankIndex = 0;

    try
    {
        //Get last modified date
        long lastMod = getLastModified(url);
        Date d = new Date(lastMod);

        //Construct the get request
        outputStream.print("GET "+ "/" + pathName + " HTTP/1.1\r\n");
        outputStream.print("If-Modified-Since: " + ft.format(d)+ "\r\n");
        outputStream.print("Host: " + hostString+"\r\n");
        outputStream.print("\r\n");
        outputStream.flush();

        //Booleans to prevent duplicates, only need first occurrences of key strings
        boolean blankDetected = false;
        boolean lastModDetected = false;

        //Keep track of current index
        int count = 0;

        int byteCount = 0;

        //While loop to read response
        String buff = "";
        byte t;
        while ( (t = (byte) inputStream.read()) != -1)
        {
            dataIn.add(t);
            //Check for key lines

            char x = (char) t;
            buff = buff + x;

            //For the first blank line (signaling the end of the header)
            if(x == '\n')
            {
                stringData.add(buff);

                if(buff.equals("\r\n") && !blankDetected)
                {
                    blankDetected = true;
                    blankIndex = count;
                    byteBlankIndex = byteCount + 2;
                }

                //For the last modified line
                if(buff.contains("Last-Modified:") && !lastModDetected)
                {
                    lastModDetected = true;
                    lastModIndex = count;
                }

                buff = "";
                count++;
            }
            //Increment count
            byteCount++;
        }

    }

通過響應解析並將文件寫入磁盤的代碼。

        String catalogKey = hostString+ "/" + pathName;

        //Get the directory sequence to make
        String directoryPath = catalogKey.substring(0, catalogKey.lastIndexOf("/") + 1);

        //Make the directory sequence if possible, ignore the boolean value that results
        boolean ignoreThisBooleanVal = new File(directoryPath).mkdirs();

        //Setup output file, and then write the contents of dataIn (excluding header) to the file
        PrintWriter output = new PrintWriter(new FileWriter(new File(catalogKey)),true);

        for(int i = byteBlankIndex + 1 ; i < dataIn.size(); i++)
        {
            output.print(new String(new byte[]{ (byte)dataIn.get(i)}, StandardCharsets.UTF_8));
        }


        output.close();
byte t;
while ( (t = (byte) inputStream.read()) != -1)

問題在這里。 它應顯示為:

int t;
while ( (t = inputStream.read()) != -1)
{
    byte b = (byte)t;
    // use b from now on in the loop.

問題是,一個字節0xff輸入將返回到int0xff ,但對byte為-1,所以你無法從流的末尾區別。

而且,您應該使用FileOutputStream,而不是FileWriter ,並且不應將潛在的二進制數據累積到StringStringBuffer或與char任何事情。 一旦到達頭的末尾,就應該打開FileOutputStream並開始復制字節。 使用緩沖流可以使所有這些操作更加高效。

鑒於HttpURLConnection已經存在,這些都沒有多大意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM