怎么用java从文件中读取图片和写入图片到文件里

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用java从文件中读取图片和写入图片到文件里相关的知识,希望对你有一定的参考价值。

怎么用java从文件中读取图片和写入图片到文件里?最好给我代码,急,谢谢。

首先导入各种需要的包:
import java.awt.Image;
import javax.imageio.ImageIO;
import java.io.*;
读取图片的方法如下:
Image[] array = new Image[10];
Image image = ImageIO.read(new File("d:\\source.gif"));//根据你实际情况改文件路径吧
array[0] = image;
图片读出来了。

如果你有一个Image对象,想把它写入文件可以这样做:
BufferedImage image = ImageIO.read(new File("d:\\source.gif"));
//要想保存这个对象的话你要把image声明为BufferedImage 类型
ImageIO.write(image, "png", new File("f:\\test.png"));
参考技术A 楼下的答案有所欠缺,我这里有个比较完整的,也很简洁的方法,大家参考下import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import javax.imageio.ImageIO;
import java.io.*;public class image
public static void main(String []args)throws IOException
Image[] array = new Image[10];
Image image = ImageIO.read(new File("c:\\supermaket1.jpg"));//这里是你要读取的图像文件
array[0] = image;
ImageIO.write((RenderedImage) image, "png", new File("f:\\test.txt"));//这里是你要写入的文件,如果不存在这个文件,那么系统会自动创建它

android怎么用流 读取云端图片

在Java 直接用BitmapFactory.decodeFile(pathName);就可以读取。
  或者用你的方式,BitmapFactory.decodeStream(fosfrom);
SE的学习过程中,我们就接触到了I/O流的概念,并且使用了一些文件输入输出流的API来将数据保存到文件或者是从文件中读取数据。同样,这个手段也适用于Android系统,我们可以在应用开发过程中使用文件相关的API方法。

何谓内部存储呢?实际上就是指将程序的私有数据以文件的形式存储在Android设备的内存中。同理,如果是存放在SD卡等地方,就称之为外部存储。

我们在,你需要建立文件的输入输出流,并在流中操作数据。

首先是写文件。
为了使用内部存储向文件中写入一些数据,你可以调用openFileOutput()方法,需要的参数为文件名和写入模式。写入模式实际上就是该文件的权限归属,可以是公有的,也可以是私有的。如何具体地创建一个文件输出流呢,具体方式如下:

FileOutputStream fileOut =
openFileOutput("file_name",MODE_WORLD_READABLE);

//第一个参数即文件名,第二个参数表示文件存储的模式

对于第二个参数,需要补充的是:文件存储的模式公有四种:

MODE_PRIVATE:该模式是默认的,通过该模式创建的文件是私有的,即只能被应用本身访问。注意:在该模式下写入的内容会覆盖原有的内容。

MODE_APPEND:与上个模式类似,但在写入内容时会检查待创建的文件是否存在。若文件已被创建,则往该文件中追加内容,而不是覆盖原来的内容;若文件未被创建,则创建新的文件。

MODE_WORLD_READABLE:表示当前创建的这个文件允许被其他应用读取。

MODE_WORLD_WRITEABLE:表示当前创建的这个文件允许被其他应用写入。

默认情况下,不仅是应用创建的文件,包括Shared
Preferences和数据库,都是私有的。那么问题来了,如果希望其他应用既能读又能写,应该怎么办呢?参考下面这种用法:

FileOutputStream fileOut = openFileOutput("file_name",MODE_WORLD_READABLE +
MODE_WORLD_WRITEABLE);

而对于openFileOutput()方法,它返回的是一个FileOutputStream实例。换言之,你通过文件输出流对象中得到了这个实例,随后你便可以调用写相关的方法来向文件写入数据。具体的用法如下:

String str = "shiyanlou";

//待写入的数据

fOut.write(str.getBytes());

//实际上写入文件的是一个字节数组,我们用gettBytes()方法将其转换成目标格式

fOut.close();

//记得写入完毕后要用close()结束

接下来是读文件。
怎样读取我们刚刚创建的这个文件呢?你应该猜到了,是使用openFileInput()方法。该方法需要填入待读取文件的文件名,同样,它返回的是一个FileInputStream的实例。具体用法如下:

FileInputStream fileIn = openFileInput(file);

在打开输入流后,你可以调用read()方法每次从文件中读出一个字符出来,然后装入一个字符串变量中。具体做法如下:

int ch;

String temp="";

while( (ch = fin.read()) != -1)

temp = temp + Character.toString((char)ch);

//不断地追加读取的内容



//通过一个for循环,你最后得到的temp字符串包含了文件中的所有数据

fileIn.close();

//记得要关闭输入流

除了上面我们用到的这些方法(比如write()、read()和close()),FileOutputStream和FileInputStream类中还有很多常用的方法,我们在下面作一简要介绍。

FileOutputStream类中的其它常用方法:

write(byte[] b, int off, int len):该方法从指定的字节数组开始到该文件输出流关闭写入len字节。

getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)

getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)

FileInputStream类中的其它常用方法:

read(byte[] b, int off, int len):该方法从输入流中数据读取最多len个字节到字节数组

getChannel():该方法返回一个只读的、与文件输出流关联的文件通道对象(FileChannel)

getFD():该方法返回与此流有关的文件描述符对象(FileDescriptor)

available():该方法可通过一个方法的调用者从输入流中阻止这个输入流返回可以读取(或跳过)的字节数的估计值。

四、在Android上实现文件读写

下面我们通过一个实例来学习如何将Java中常用的文件读写沿用到Android中去。

实验步骤主要有:

(若你已在第二小节完成,请跳至下一步)使用Android
Studio创建应用项目FileIOPractice,包名为com.shiyanlou.android.fileiopractice,基于Android
5.1制作。同时添加MainActivity及其布局资源文件。

创建并打开AVD模拟器(镜像选择API22:Android 5.1.1)。

在res/layout/activity_main.xml资源文件放入一些文本框和按钮。

在MainActivity.java中,初始化要用到的控件,添加文件读写相关的代码。

编译并运行这个应用,等待应用安装至模拟器,在模拟器中使用该应用。

现在你可以按照上述步骤自己完成该实验。下面也给出了本实验涉及到的源代码和资源文件详情,在必要时你可以使用它们。在注释中我们也对一些模块进行了详细的讲解。

以下是MainActivity的布局文件res/layout/activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"

android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textview_domain"

android:text="Shiyanlou.com"

android:textSize="40dp"

android:textColor="#11AA8C"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView_appName"

android:text="File I/O Practice"

android:layout_below="@+id/textview_domain"

android:layout_centerHorizontal="true"

android:textColor="#000000"

android:textSize="40dp" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/editText"

android:hint="Input some text here."

android:focusable="true"

android:layout_marginTop="20dp"

android:layout_below="@+id/textView_appName"

android:layout_alignEnd="@+id/textView_appName"

android:layout_alignLeft="@+id/textView_appName"

android:layout_alignStart="@+id/textView_appName"

android:layout_alignRight="@+id/textView_appName"

android:inputType="textMultiLine"

android:minLines="5"

android:background="#DDDDDD" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:id="@+id/textView_data"

android:text="Text would be shown here."

android:layout_below="@+id/button_save"

android:layout_marginTop="10dp"

android:layout_centerHorizontal="true" />

android:layout_width="120dp"

android:layout_height="wrap_content"

android:id="@+id/button_save"

android:text="Save File"

android:textColor="#FFFFFF"

android:background="#11AA8C"

android:layout_alignLeft="@+id/textView_appName"

android:layout_alignStart="@+id/textView_appName"

android:layout_below="@+id/editText"

android:layout_marginTop="20dp"/>

android:layout_width="120dp"

android:layout_height="wrap_content"

android:id="@+id/button_load"

android:text="Load File"

android:textColor="#FFFFFF"

android:background="#11AA8C"

android:layout_alignTop="@+id/button_save"

android:layout_alignRight="@+id/editText"

android:layout_alignEnd="@+id/editText" />

以下是src/MainActivity.java中的源代码:

package com.shiyanlou.android.fileiopractice;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import java.io.FileInputStream;

import java.io.FileOutputStream;

public class MainActivity extends Activity

private Button button_save;

private Button button_load;

private TextView textView_status;

private EditText editText;

//声明各个控件

private String data;

private String file = "shiyanlou_file";

//声明用于存放数据的变量data和文件名常量file

@Override

protected void onCreate(Bundle savedInstanceState)

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button_save =(Button)findViewById(R.id.button_save);

button_load =(Button)findViewById(R.id.button_load);

editText =(EditText)findViewById(R.id.editText);

textView_status =(TextView)findViewById(R.id.textView_data);

//实例化各个控件

//为按钮设置点击事件监听器

//首先是保存按钮(写操作)

button_save.setOnClickListener(new View.OnClickListener()

@Override

public void onClick(View v)

data = editText.getText().toString();

//调用getText()方法从文本框中读取内容,使用toString()方法将其转化为String类型数据,并存放到data变量中

try

//对于文件读写操作应使用异常处理流程

FileOutputStream fileOut = openFileOutput(file, MODE_APPEND);

// 此处用到了MODE_PRIVATE,在新版本的Android系统中,不推荐使用MODE_WORLD_READABLE等模式

// 这是因为Android中为应用间的数据交互提供了更好的支持,如Content Privoder等,你可一进步了解

fileOut.write(data.getBytes());

//用write()方法保存数据

fileOut.close();

//关闭输出流

Toast.makeText(getBaseContext(), "File saving completed.",
Toast.LENGTH_SHORT).show();

//用一个Toast来告诉用户已经写入完毕了

catch (Exception e)

e.printStackTrace();





);

//其次是读取按钮(读操作)

button_load.setOnClickListener(new View.OnClickListener()

@Override

public void onClick(View v)

try

//同理,建立文件输入流

FileInputStream fileIn = openFileInput(file);

int ch;

//声明一个整型变量ch用于接收数据

String tempText = "";

//这里的tempText用于临时存放读取的数据(字符串)

while ((ch = fileIn.read()) != -1)

//这里的-1是特定的状态码,表示文件读取结束

//在while循环中逐个读取数据,并追加到tempText中

tempText = tempText + Character.toString((char) ch);

//将ch转化为字符



textView_status.setText(tempText);

//读取完毕后将文字显示出来

Toast.makeText(getBaseContext(), "File reading completed.",
Toast.LENGTH_SHORT).show();

//同样用一个Toast告知用户已经读取完成

catch (Exception e)





);





检查一下代码,编译并运行该应用。在模拟器中尝试输入一些信息,保存一下,再试着读取它们。
参考技术A   直接用BitmapFactory.decodeFile(pathName);就可以读取。
  或者用你的方式,BitmapFactory.decodeStream(fosfrom);

  而且你这种读取方式也不对。你把一个图片分成多次读取,ByteArrayInputStream流里只保存了最后一份数据,怎么可能是个完整的图片。本回答被提问者和网友采纳
参考技术B 打开移动数据 从网页 登录云端 或者下载 对应 APP 登录

以上是关于怎么用java从文件中读取图片和写入图片到文件里的主要内容,如果未能解决你的问题,请参考以下文章

java里怎么把从数据库里读取的图片类型数据 显示到页面上啊 ?

用c语言如何读取和保存jpg图片文件?

java web开发,上传图片并读取

java从数据库里读文件变乱码

android怎么用流 读取云端图片

java怎样将读取数据写入数据库