Categorías
Real Methods

Java: convertir imagen en matriz de bytes, convertir matriz de bytes en imagen

Esta publicación muestra dos formas diferentes de convertir una imagen en una matriz de bytes y convertir una matriz de bytes en una imagen.

En primer lugar, el tipo de byte en Java es un entero de complemento a dos con signo de 8 bits. Su rango es [-128, 127]. Una matriz de bytes es solo una matriz de bytes. Una imagen es esencialmente un archivo. Entonces, la tarea es convertir el archivo en una matriz para que pueda almacenarse o transferirse más fácilmente en diferentes tipos de aplicaciones.

1. Método 1

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
 
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
 
public class ConvertImage {
 
    public static void main(String[] args) throws FileNotFoundException, IOException {
    	/*
    	 * 1. How to convert an image file to  byte array?
    	 */
 
        File file = new File("C:rose.jpg");
 
        FileInputStream fis = new FileInputStream(file);
        //create FileInputStream which obtains input bytes from a file in a file system
        //FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.
 
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        try {
            for (int readNum; (readNum = fis.read(buf)) != -1;) {
                //Writes to this byte array output stream
                bos.write(buf, 0, readNum); 
                System.out.println("read " + readNum + " bytes,");
            }
        } catch (IOException ex) {
            Logger.getLogger(ConvertImage.class.getName()).log(Level.SEVERE, null, ex);
        }
 
        byte[] bytes = bos.toByteArray();
 
        /*
         * 2. How to convert byte array back to an image file?
         */
 
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        Iterator<?> readers = ImageIO.getImageReadersByFormatName("jpg");
 
        //ImageIO is a class containing static methods for locating ImageReaders
        //and ImageWriters, and performing simple encoding and decoding. 
 
        ImageReader reader = (ImageReader) readers.next();
        Object source = bis; 
        ImageInputStream iis = ImageIO.createImageInputStream(source); 
        reader.setInput(iis, true);
        ImageReadParam param = reader.getDefaultReadParam();
 
        Image image = reader.read(0, param);
        //got an image file
 
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        //bufferedImage is the RenderedImage to be written
 
        Graphics2D g2 = bufferedImage.createGraphics();
        g2.drawImage(image, null, null);
 
        File imageFile = new File("C:newrose2.jpg");
        ImageIO.write(bufferedImage, "jpg", imageFile);
 
        System.out.println(imageFile.getPath());
    }
}

2. Método 2

La siguiente es una versión más simple que hace lo mismo. Utiliza la clase BufferedImage, que es una forma probada más eficiente.

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
 
 
public class SimpleConvertImage {
	public static void main(String[] args) throws IOException{
		String dirName="C:";
		ByteArrayOutputStream baos=new ByteArrayOutputStream(1000);
		BufferedImage img=ImageIO.read(new File(dirName,"rose.jpg"));
		ImageIO.write(img, "jpg", baos);
		baos.flush();
 
		String base64String=Base64.encode(baos.toByteArray());
		baos.close();
 
		byte[] bytearray = Base64.decode(base64String);
 
		BufferedImage imag=ImageIO.read(new ByteArrayInputStream(bytearray));
		ImageIO.write(imag, "jpg", new File(dirName,"snap.jpg"));
	}
}

3. Enlaces de descarga

Puede descargar el código del método 1 y el método 2.

Categorías
Real Methods

Java: convierta un archivo en una matriz de bytes, luego convierta la matriz de bytes en un archivo.

En esta publicación, le mostraré cómo convertir un archivo en una matriz de bytes y luego convertir una matriz de bytes en un archivo.

Para convertir un archivo en una matriz de bytes, se usa la clase ByteArrayOutputStream. Esta clase implementa un flujo de salida en el que los datos se escriben en una matriz de bytes. El búfer crece automáticamente a medida que se escriben datos en él. Los datos se pueden recuperar usando toByteArray () y toString ().

Para convertir la matriz de bytes de nuevo al archivo original, se usa la clase FileOutputStream. Un flujo de salida de archivo es un flujo de salida para escribir datos en un archivo o en un descriptor de archivo.

El siguiente código ha sido completamente probado.

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class genFile {
 
    public static void main(String[] args) throws FileNotFoundException, IOException {
        File file = new File("java.pdf");
 
        FileInputStream fis = new FileInputStream(file);
        //System.out.println(file.exists() + "!!");
        //InputStream in = resource.openStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        try {
            for (int readNum; (readNum = fis.read(buf)) != -1;) {
                bos.write(buf, 0, readNum); //no doubt here is 0
                //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                System.out.println("read " + readNum + " bytes,");
            }
        } catch (IOException ex) {
            Logger.getLogger(genJpeg.class.getName()).log(Level.SEVERE, null, ex);
        }
        byte[] bytes = bos.toByteArray();
 
        //below is the different part
        File someFile = new File("java2.pdf");
        FileOutputStream fos = new FileOutputStream(someFile);
        fos.write(bytes);
        fos.flush();
        fos.close();
    }
}

¿Por qué alguien querría convertir un archivo en una matriz de bytes?

Hay varias aplicaciones de esta conversión. Por ejemplo, convierta el archivo en byte para guardarlo en la base de datos, transfiera el archivo a otro sistema usando el servicio web, etc.

Del mismo modo, puede convertir una imagen en una matriz de bytes, consulte esta publicación.

ACTUALIZACIÓN (16/12/2015):
Existe un método muy conveniente de com.google.common.io.FilestoByteArray(). Vea algunos ejemplos aquí.

Referencias:

1. ByteArrayOutputStream Java Doc
2. FileOutputStream Java Doc

Categorías
Real Methods

Usando Java para leer la página web

El siguiente es el código para leer el contenido html de una página web.

Usar Java para leer una página web es diferente a usar Java para llamar a IE para abrir páginas web. El recuento de visitantes para un blog general no puede aumentar de esta manera. Para aumentar el número de visitantes, necesita un programa que pueda llamar a IE para abrir una página web.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
 
public class Main {
	public static void main(String[] args) {
        try {
            URL google = new URL("http://www.google.com/");
            BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream()));
            String inputLine; 
 
            while ((inputLine = in.readLine()) != null) {
                // Process each line.
                System.out.println(inputLine);
            }
            in.close(); 
 
        } catch (MalformedURLException me) {
            System.out.println(me); 
 
        } catch (IOException ioe) {
            System.out.println(ioe);
        }
    }//end main
}

Esto está realmente en el nivel inferior. Simplemente podemos usar Jsoup para hacer lo mismo de una manera más fácil.

Categorías
Real Methods

Código Java: abra el navegador IE y ciérrelo

Quiero actualizar mi blog en Sohu para aumentar el número de visitantes. El siguiente es el código para abrir el navegador IE y luego cerrarlo. Esto se hará cada 5 segundos, y en un día el recuento debería poder aumentar 3600 * 24/5 = 17280. Entonces, si abre su computadora 10 días, el recuento será 172800. Ese será un buen número.

Aquí está el código Java para abrir y cerrar IE:

public class OpenClose {
	public static void main(String[] args) {
		while(true){
			try {
				Process p = Runtime.getRuntime().exec("C:Program FilesInternet Exploreriexplore.exe "http://www.google.com"");
				Thread.sleep(5000);
				p.destroy();
				System.out.println("Return value was " + p.waitFor());
			} catch (Exception e) {}
		}
	}
}

Categorías
Real Methods

Convierta el archivo jar de Java a exe

Al utilizar el asistente de exportación de eclipse, puede obtener archivos jar ejecutables. Pero el archivo jar solo se puede iniciar usando líneas de comando. Aparentemente, esta no es una buena opción para la mayoría de los usuarios habituales que no son programadores de Java, especialmente si el programa requiere la entrada del usuario para continuar. Necesitamos un programa que se pueda iniciar haciendo doble clic.

Para convertir un archivo .jar en un archivo ejecutable de Windows, existe una buena herramienta llamada launch4j. Puede convertir fácilmente un archivo jar a exe, luego sus usuarios pueden hacer doble clic en el ícono e iniciar el programa.

Aquí hay una instantánea de esta herramienta:

Cómo usar launchrj es muy sencillo y es gratis sin ningún compromiso.

Las siguientes son algunas otras características que tiene:

  • Los archivos JAR se pueden incluir en un archivo ejecutable;
  • Ejecute aplicaciones Java con cualquier directorio actual;
  • Las aplicaciones Java pueden hacer uso de la asociación de tipos de archivos;
  • Las aplicaciones Java se ven como programas nativos de Windows (y puede crear accesos directos de Windows para su aplicación Java en el menú Inicio o en el escritorio);
  • Utilice el icono (archivo .ico) de su elección o diseño para su ejecutable;
  • Mensajes completamente localizables del ejecutable

Como verá en mi publicación posterior, hay un buen complemento de eclipse: fat jar que convierte todos los archivos java en un archivo jar. Primero puede usar fat jar para obtener un jar, luego use launch4j para convertirlo a un archivo .exe.

Categorías
Real Methods

¿Cómo utilizar el archivo de propiedades de Java?

Para propósitos de configuración, usar el archivo de propiedades es una buena forma de reutilizar. De esta manera, cuando el código se empaqueta en un archivo jar, otros usuarios pueden simplemente poner las diferentes configuraciones en el archivo config.properties. El siguiente es un ejemplo sencillo de cómo utilizar el archivo de propiedades.

1. cree la jerarquía de archivos como se muestra a continuación. Principalmente recuerde poner el archivo config.properties en el paquete src. Otro código de prueba y clase de base de datos se colocan en un paquete diferente bajo src.

2. El siguiente es el código.

package Test;
 
import java.io.IOException;
import java.util.Properties;
 
public class Test {
 
	public static void main(String[] args) {
		Properties configFile = new Properties();
		try {
			configFile.load(Test.class.getClassLoader().getResourceAsStream("config.properties"));
			String name = configFile.getProperty("name");
			System.out.println(name);
		} catch (IOException e) {
 
			e.printStackTrace();
		}
	}
 
}

3. El contenido del archivo de configuración siguiendo el formato de «clave = valor».

Categorías
Real Methods

Programe una tarea de Java para que se ejecute en un momento determinado y envuélvala como un servicio de Windows

Hacer un programa Java que se ejecute en un momento determinado no es difícil, solo podemos usar las clases java.util.Timer y java.util.TimerTask, aquí está el código.

public class Main {
 
	public static void main(String[] args) {
		Timer timer = new Timer();
		TimerTask tt = new TimerTask(){
			public void run(){
				Calendar cal = Calendar.getInstance(); //this is the method you should use, not the Date(), because it is desperated.
 
				int hour = cal.get(Calendar.HOUR_OF_DAY);//get the hour number of the day, from 0 to 23
 
				if(hour == 14){
					System.out.println("doing the scheduled task");
				}
			}
		};
		timer.schedule(tt, 1000, 1000*5);//	delay the task 1 second, and then run task every five seconds
	}
}

Luego, necesitamos envolver esta aplicación como un servicio de Windows que puede ejecutarse automáticamente después de que se enciende el sistema.
yo suelo Contenedor de servicios Java, aquí hay una muy buena tutorial para mostrar cómo usarlo usando el Método 3. Si hay algún problema, avíseme y tal vez pueda ayudar.

Categorías
Real Methods

Java.lang.exception: no se puede localizar la biblioteca en com.izforge.izpack.util.librarian.loadarchspecificlibrary

Java.lang.exception: no se puede localizar la biblioteca en com.izforge.izpack.util.librarian.loadarchspecificlibrary

Es posible que estos no sean todos los mensajes de error que recibió. Solo copié esta parte aquí para su búsqueda.

Si recibió este mensaje, vea si está utilizando JDK de 64 bits. Reinstalé Java 32bit, luego el mensaje desapareció.
Actualmente, los accesos directos no son compatibles con Windows de 64 bits.

Categorías
Real Methods

Eclipse: java.lang.UnsupportedClassVersionError: Número de versión incorrecto en el archivo .class

Mientras programaba para un pequeño proyecto en Eclipse IDE, recibí el siguiente mensaje de error:

java.lang.UnsupportedClassVersionError: número de versión incorrecto en el archivo .class

El problema es que la compilación JRE y la ejecución de JRE no son lo mismo. Así que necesitamos hacerlos de la misma versión, por ejemplo 1.6.

También puede haber la biblioteca JRE en su proyecto respectivo. Esta vez, solo puede eliminar un JRE de la ruta de compilación.

PARA eliminar de la ruta de compilación, vaya a Proyecto -> BulidPath -> cofigureBuildPath -> pestaña Biblioteca

Categorías
Real Methods

Ordenar contenido en un archivo txt

Si tiene un archivo con palabras o términos en cada línea, es posible que desee ordenarlo. Java Arrays.sort es una función agradable común para hacer esto. Collections.sort () es otro buen comentario. Aquí hay un ejemplo y un código.
EG en un archivo, tiene el siguiente txt.

dog 
cat
--windows
--kankan
pps
game
--annot be guaranteed 
as it is, generally speaking, 
--impossible to make any hard gu
arantees in the p
--resence of unsynchr

Aquí está el código para ordenar las líneas, excluyendo las líneas que comienzan con «-«.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
 
 
public class SortFileContent {
	public static void sortObserve() throws IOException {
		File fin = new File("c:input.txt");
		File fout = new File("c:sorted.txt");
 
 
		FileInputStream fis = new FileInputStream(fin);
		FileOutputStream fos = new FileOutputStream(fout);
 
		BufferedReader in = new BufferedReader(new InputStreamReader(fis));
		BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fos));
 
		String aLine;
		ArrayList<String> al = new ArrayList<String> ();
 
 
		int i = 0;
		while ((aLine = in.readLine()) != null) {
			//get the lines you want, here I don't want something starting with - or empty
			if (!aLine.trim().startsWith("-") && aLine.trim().length() > 0) {
				al.add(aLine);
				i++;
			}
		}
 
		Collections.sort(al);
		//output sorted content to a file
		for (String s : al) {
		    System.out.println(s);
		    out.write(s);
			out.newLine();
			out.write("-----------------------------------------");
			out.newLine();
		}
 
		in.close();
		out.close();
	}
}

Finalmente, obtiene lo siguiente en el archivo sorted.txt.

arantees in the p
-----------------------------------------
as it is, generally speaking, 
-----------------------------------------
cat
-----------------------------------------
dog 
-----------------------------------------
game
-----------------------------------------
pps
-----------------------------------------