问题
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