saving a json file to internal memory

人盡茶涼 提交于 2019-12-04 06:48:21

问题


hey there guys and girls i have this code that should download a json object and then save it to internal memory, i keep getting stuck here

    try{
        //connects to mySQL
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php");
        HttpResponse response = client.execute(post);
        //captures the response
        entity = response.getEntity();
    }catch(Exception e) {
         Log.e("log_tag", "Error in http connection "+e.toString());
    }
    try{
        is = entity.getContent();
        String FILENAME = "story.json";
        //gives file name
        FileOutputStream output = openFileOutput(FILENAME, MODE_WORLD_READABLE);
        //creates new StreamWriter
        OutputStreamWriter writer = new OutputStreamWriter(output);
        //writes json with file name story.json
        writer.write(is);
        writer.flush();
        //closes writer
        writer.close();

    }catch(Exception e) {
         Log.e("log_tag", "Error saving string "+e.toString());
    }

i keep getting erros on writer.write(is); eclipse asks me to change it to an int, what would be the best way to code from the line

entity = response.getEntity();

???

here is my full code

    public class MainActivity extends Activity {

String storyObj = "";
Object json = null;
HttpEntity entity = null;
InputStream is = null;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    //button that saves the file from mySQL
    Button save = (Button) findViewById(R.id.downloadBtn);
    save.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            saveJson();             
        }
    });

    //Button that opens the file from InternalMemory
    Button open = (Button) findViewById(R.id.showBtn);
    open.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            openJson();             
        }
    });


//end of onCreate() 
}


//saveJson pull a JSON file from mySQl server then saves that file in its JSON type eg .json
public void saveJson(){
    TextView test = (TextView) findViewById(R.id.showView);


    try{
        //connects to mySQL
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php");
        HttpResponse response = client.execute(post);
        //captures the response
        entity = response.getEntity();
    }catch(Exception e) {
         Log.e("log_tag", "Error in http connection "+e.toString());
    }
    try{
        is = entity.getContent();
        String FILENAME = "story.json";
        //gives file name
        FileOutputStream output = openFileOutput(FILENAME, MODE_WORLD_READABLE);
        //creates new StreamWriter
        OutputStreamWriter writer = new OutputStreamWriter(output);
        //writes json with file name story.json
        writer.write(is);
        writer.flush();
        //closes writer
        writer.close();

    }catch(Exception e) {
         Log.e("log_tag", "Error saving string "+e.toString());
    }

//end of saveJson()
}

private char[] Object(Object json2) {
    // TODO Auto-generated method stub
    return null;
}


public void openJson(){
    TextView test = (TextView) findViewById(R.id.showView);



    try{
        FileInputStream fileInput = openFileInput("story.json");

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(fileInput, "UTF-8"), 8);
        StringBuilder strBuilder = new StringBuilder();
            String line = null;
            while ((line = inputReader.readLine()) != null) {
                strBuilder.append(line + "\n");
            }
            fileInput.close();
            storyObj = strBuilder.toString();

    }catch(IOException e){
         Log.e("log_tag", "Error building string "+e.toString());
    }

    try{
        JSONArray jArray = new JSONArray(storyObj);
        String storyNames = "";
        for(int i = 0;i<jArray.length();i++){
            storyNames += jArray.getJSONObject(i).getString("story_name") +"\n";
        }
        test.setText(storyNames);

    }catch(JSONException e) {
         Log.e("log_tag", "Error returning string "+e.toString());
    }
    return;
//and of openJson() 
}




//end of class body    
}

hope you can help me with this, been taking so long to get it to work!!!

added extra code from boris... is this where i put the code ?

    try{
        //connects to mySQL
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost("http://10.0.2.2/textures_story_list.php");
        HttpResponse response = client.execute(post);
        //captures the response
        entity = response.getEntity();
        InputStream entityStream = entity.getcontent();
        StringBuilder entityStringBuilder = new StringBuilder();
        byte [] buffer = new byte[1024];
        int bytesReadCount;
        while ((bytesReadCount = entityStream(read(buffer)) > 0)) {
            entityStringBuilder.append(new String(buffer, 0, bytesReadCount));
        }
        String entityString = entityStringBuilder.toString();
        Integer responseInteger = Integer.valueOf(entityString);
    }catch(Exception e) {
         Log.e("log_tag", "Error in http connection "+e.toString());
    }

if it is i get an error on read


回答1:


This is weird case, I edited my previous answer to fix this problem of yours. However: another question was asked, so here goes this portion of my previous answer:

About the error you get - you are trying to cast the entity of the response directly to an Integer. This will always fail, because Integer is not superclass of HttpEntity. You need to read the contents of the entity in a String and then parse the contents of the string to integer:

InputStream entityStream = entity.getcontent();
StringBuilder entityStringBuilder = new StringBuilder();
byte [] buffer = new byte[1024];
int bytesReadCount;
while ((bytesReadCount = entityStream.read(buffer)) > 0) {
    entityStringBuilder.append(new String(buffer, 0, bytesReadCount));
}
String entityString = entityStringBuilder.toString();
writer.wrtie(entityString);

this is not highly optimized, but does the job. From then on you can use the responseInteger value as you like . However if you want to do writer.write you will need String value, not Integer. Thus I recommend you to use entityString.




回答2:


Try this code

package com.android.test.CacheDemo;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class CachingDemoActivity extends Activity implements OnClickListener{
    private static String URL="http://bhaskar1.cntdy.mobi/punjabkesari/appdetails/sectiondetails.json";
    private static String FILE_NAME = "CachedResponse";
    private Button startAPICallButton;
    private Button retrieveFromCacheButton;

    /* view lifecycle methods*/
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        this.initializeComponents();
    }
    /*overriden methods*/
    public void onClick(View clickedView)
    {
        if(clickedView == this.startAPICallButton)
        {
            Toast.makeText(this, "Making the API call... Please wait", Toast.LENGTH_LONG).show();
            this.makeAPICall();
        }
        else if(clickedView == this.retrieveFromCacheButton)
        {
            Toast.makeText(this, "Retrieving data from the cache!!!", Toast.LENGTH_LONG).show();
            this.retrieveStuffFromCache();
        }
    }
    /* private methods*/
    private void initializeComponents()
    {
        this.startAPICallButton = (Button) this.findViewById(R.id.start_api_call_button);
        this.startAPICallButton.setOnClickListener(this);
        this.retrieveFromCacheButton = (Button) this.findViewById(R.id.retrieve_cache_button);
        this.retrieveFromCacheButton.setOnClickListener(this);
    }
    private void makeAPICall()
    {
        new Thread(new Runnable() 
        {
            @Override
            public void run() 
            {
                try
                {
                    //download the json onto the device.
                    URL url = new URL(CachingDemoActivity.URL);
                    URLConnection connection = url.openConnection();
                    //read the data and store it in a byte array first.
                    //dont use this code for big json file 
                    //as long as its a json and not very long, this will work just fine!!!
                    InputStream inStream = connection.getInputStream();
                    ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
                    int readByte = 0;
                    //read the bytes one-by-one from the inputstream to the buffer.
                    while(true)
                    {
                        readByte = inStream.read();
                        if(readByte == -1)
                        {
                            break;
                        }
                        byteOutStream.write(readByte);
                    }
                    byteOutStream.flush();
                    inStream.close();
                    byteOutStream.close();
                    byte[] response = byteOutStream.toByteArray();
                    //now response byte array is the complete json in the biary form. We will save this stuff to file.
                    File cacheDir = CachingDemoActivity.this.getCacheDir();
                    File jsonFile = new File(cacheDir, FILE_NAME);
                    FileOutputStream outStream = new FileOutputStream(jsonFile);
                    //write the whole data into the file
                    for(int i = 0; i < response.length; i++)
                    {
                        outStream.write(response[i]);
                    }
                    android.util.Log.e("status - ","API call is complete!!");
                    //this should do the trick of saving all the stuff in the file with file name CachedResponse!!
                    //let see if we can retrieve the stuff!!!
                } 
                catch (Exception e) 
                {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private void retrieveStuffFromCache()
    {
        new Thread(new Runnable() 
        {
            @Override
            public void run() 
            {
                try
                {
                    File jsonFile = new File(CachingDemoActivity.this.getCacheDir(), FILE_NAME);
                    FileInputStream fInStream = new FileInputStream(jsonFile);
                    ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
                    int readByte = 0;
                    while(true)
                    {
                        readByte = fInStream.read();
                        if(readByte == -1)
                        {
                            break;
                        }
                        byteOutStream.write(readByte);
                    }
                    fInStream.close();
                    byteOutStream.flush();
                    byteOutStream.close();
                    byte[] retrievedStringData = byteOutStream.toByteArray();
                    String originalJson = new String(retrievedStringData);
                    android.util.Log.e("json - ", originalJson);
                }
                catch(Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        }).start();
    }
}


来源:https://stackoverflow.com/questions/9451572/saving-a-json-file-to-internal-memory

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!