[备忘] Java BigDecimal 转换 为 字节 数组

Java BigDecimal Serialization 手动序列化

直接看代码:

代码如下:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;

public class TestBigDecimalSerialization
{
   static String[] TESTING_VALUES = new String[]
   {
      "999999999998888888888888888888888888.2323", 
      "0", 
      "0.0000000001", 
      "0.000", 
      "7603.4919740918050", 
      "7819.1205269716930", 
      "-9506.8541926295180",
   };

	public static void main(String[] args) {
		String sFile = "tmptest.tmp";

		BigDecimal[] bds1 = toBigDecimals(TESTING_VALUES);

		// 先写到文件中
		write(bds1, sFile);

		// 再从文件中读出来
		BigDecimal[] bds2 = read(sFile);

		// 再一一比较
		for (int i = 0; i < bds2.length; i++) {
			if (bds2[i].equals(bds1[i])
					&& bds2[i].toPlainString().equals(TESTING_VALUES[i])) {

			} else {
				System.out.println("fail to seriable " + TESTING_VALUES[i]
						+ ", value is " + bds2[i].toPlainString());
			}
		}

		new File(sFile).delete();
	}

	static void write(BigDecimal[] abd, String sFile) {
		try {
			FileOutputStream fos = new FileOutputStream(sFile);
			DataOutputStream dos = new DataOutputStream(fos);
			int iValues = abd.length;

			dos.writeInt(iValues);

			for (int i = 0; i < iValues; i++) {
				BigDecimal bd = abd[i];

				// 这儿是关键
				byte[] aBytes = bd.unscaledValue().toByteArray();
				short iBytes = (short) aBytes.length;
				short iScale = (short) bd.scale();

				dos.writeShort(iBytes);
				dos.write(aBytes);
				dos.writeShort(iScale);
			}

			if (dos != null)
				dos.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	static BigDecimal[] read(String sFile) {
		BigDecimal[] abd = null;

		try {
			FileInputStream fis = new FileInputStream(sFile);
			DataInputStream dis = new DataInputStream(fis);
			int iValues = dis.readInt();

			abd = new BigDecimal[iValues];

			for (int i = 0; i < iValues; i++) {
				// //这儿是关键
				int iBytes = dis.readShort();
				byte[] aBytes = new byte[iBytes];

				dis.read(aBytes);

				int iScale = dis.readShort();

				abd[i] = new BigDecimal(new BigInteger(aBytes), iScale);
			}

			if (dis != null)
				dis.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}

		return abd;
	}

	static BigDecimal[] toBigDecimals(String[] strValues) {
		int iLen = strValues == null ? 0 : strValues.length;
		BigDecimal[] abd = new BigDecimal[iLen];
		for (int i = 0; i < iLen; i++) {
			abd[i] = new BigDecimal(strValues[i]);
		}
		return abd;
	}
}
smithfox | Friday 03 June 2011 at 4:20 pm | | Java        | Used tags: , , ,

five comments

jiage110

FileOutputStream fos = new FileOutputStream(sFile);
DataOutputStream dos = new DataOutputStream(fos); 这里不用文件缓冲,采用ObjectOutpuStream在内存中进行效率会更好

jiage110, - 20-09-’11 13:12
smithfox

这里不适合用 ObjectOutputStream, 因为重点是 自己写的,可以控制的 BigDecimal到 byte[]之间的转换.
ObjectOutputStream是调用了 BigDecimal这个类的自己序列化, 相当于是一个黑盒.

smithfox, (URL) - 20-09-’11 16:03
louis vuitton iphone 6 cases

Fortunately there are some handy tools built into Android Lollipop and some excellent third-party applications that can help you make sure all your data is safely copied elsewhere.

louis vuitton iphone 6 cases, (URL) - 20-04-’15 18:34
Louis Vuitton iPhone 6 Wallet Case

New episodes of Happy Hour are available every Wednesday. As mentioned, you can download this podcast via iTunes or plug in our RSS feed link into your favorite podcasting app.

Louis Vuitton iPhone 6 Wallet Case, (URL) - 08-10-’15 21:19
entretien ménager résidentiel et commercial montreal rive nord et rive sud

service de femme de ménage
Professionnelle de l’entretien, notre dynamique entreprise saura réaliser pour vous l’ensemble des travaux ménagers.

G.E.M. s’engage sur une prestation de qualité !

Notre équipe dde spécialistes chevronnés accomplira un travail
à la fois soigné, rapide et économique.
De plus, nous utilisons exclusivement des produits écologiques et
hautemnent performants, iasus des toutes dernières technologies.

La vie moderne véhicule aussi de lourdes menaces. D’apparence
inoffensive, meubles, appareils ménagers, matériaux de construction, jouets ou
objets familiers peuvent dégager dess phtalates ou
autres redoutables composés chimiques.

Franchise de Nettooyage Résidentiel et Commercial, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial,
ménage résidentiel, service d’entretien ménager montréal
Nous aidxons less persoknnes désireuses d’être propriétaires d’entreprises prospères à devenir des professionnels du
nettoyage commercial et de la maintenance.

En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide
apportée par un modèle d’affaires éprouvé
vous assurant de travailler avec un leader du domaine disposant de l’expérience et la stabilité.

Vous disiez augmentez vos revenus afin d’améliorer votre
quotidien ? Faites Appel a G.E.M Ménage! service dee femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d’entretien ménager montréal, servicee de femme de ménage ,entretien ménager commercial,entretien ménager commercial,
ménage résidentiel, service d’entretien ménager montréal
Franhises de Nettoyage Résidentiel et Commercial disponible Partout A Montréal
,Rivee Nord et Rive Sud.

Financement Sans Intérêt par G.E.M .
Un dépôt est oblikgatoire

Un Investissement de 24 000$ Vous Rapporte (4800$ et plus de Revenus
par Mois)!

Matériel et formation fourni

Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à
dewvenir dess professionnels du nettoyagee commercial et de la maintenance.
En rejoignant notre réseau d’entreprises, vous bénéficierez d’un vantage concurrentiel ainsi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant
de travailler avec unn leadder du domaine disposant de
l’expérience et la stabilité.

G.E.M Ménage vous offre l’opportunité de travailler pendant la
journée de lundi a vendredi .

G.E.M Vouus propose dess contrats d’entretien ménager avec des horaires
souples et un revenu garanti.

Pour les personnes libres,les nouveaux arrivants ou les sans-emplois G.E.M peut favoriser votre
accès au marché du travail !

G.E.M vous propose des contrats stables et rémunérateurs!

Dans le secteur résidentiel idéal pour un couple, ou un homme seul dans le secteur commercial

Vous débuter des maintenant

Des techniques et méthodes de travail éprouvées.

Une aide à la constitution ouu à l’enregistrement de
leur entreprise.
Dees territoires d’exercice protégés.
Entreprise clés een main.
Un garantie quii protège votre investissement

Exigences de l’entrée de notre réseau :
Les demandes sont examinées attentivment et une enquête relative à
la candidature est menée.
Les candidats doivent passer une entrevue de sélection.
Avant tout début d’activité, les candidats doivent assister à des sessions de formation.

Au G.E.M. nous nous assurons quue nnos franchisés puissent offrir à leurs clients
un service professionnel d’une qualité supérieure à celle de laa concurrence.

Franchise disponible au résidentiel et commercial

N’hésitez pas à noous contacter
469 Jean-Talon Ouest Suite # 222
Montreal QC
gemmenage.net
gemmenage.com

entretien ménager résidentiel et commercial montreal rive nord et rive sud, (URL) - 10-08-’17 01:03
(optional field)
(optional field)
为阻止垃圾广告, 请在提交评论前, 回答一个简单问题(Please answer an simple question)
Remember personal info?
Notify
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.