Tamanho máximo de uma String/StringBuffer

Pessoal

Preciso usar um tipo de String o quanto maior possível, pode ser String ou StringBuffer.

Dúvida: Qual das duas é maior e qual o tamanho máximo das duas?

Valeu

Dê uma olhada aqui no Guj mesmo, no tutorial falando sobre Strings.
Se vc vai fazer uma atribuição somente, ex.:

String str = "1 até ....";

aconselho a usar String mesmo.

Mas dá uma olhada no tutorial lá.
Abraço.

Desculpe Fábio mas eu não consegui achar o tutorial. Vc poderia me passar o link por favor?

Detalhe, minha dúvida é em relação ao tamanho máximo que eu poderia usar de uma variável do tipo String.

O tamanho máximo teórico de uma String, em caracteres, é de 2 bilhões de caracteres.

É a mesma coisa para um StringBuffer, ou um char[].

Ocorre que esse limite dificilmente é alcançado porque você acaba ficando sem memória antes desse limite ser alcançado (não, não adianta no caso do Windows 32 bits especificar -Xmx3G e ter 4GB de memória na máquina. O Java não consegue alocar mais que 1,6GB de memória contígua no Windows 32 bits.

Estou usando a seguinte declaração de uma variável:

StringBuffer retornoBroker = new StringBuffer(5000000);

E quando eu atribuo o valor que preciso para ela, tenho a seguinte mensagem de erro:API: Msg truncated to fit receive-buffer

Eu não lembro qto de mémoria um objeto de String aloca.
:frowning:
Mas o tamanho de caracteres é mto grande. Pro StringBuffer a mesma coisa.
qtos caracteres vc quer colocar?

oque vc quer colocar na String?

Olha o link que te falei:
http://www.guj.com.br/java.tutorial.artigo.103.1.guj

Só lembrando todo mundo: String != array de bytes. Se você precisa lidar com mensagens, provavelmente vai ter de lidar com bytes, então tanto String quanto StringBuffer são completamente não apropriadas para mexer com mensagens. É que a conversão array de bytes &lt=&gt string costuma danificar alguns bytes, que são trocados para o caracter ‘?’.

O problema é que o meu retorno, que é do tipo String, é variável, pois faço uma leitura em um outro ambiente através de broker e retorno uma lista de registros desse outro ambiente, essa lista vem pra mim como uma string e eu formato ela da forma que preciso.

Por ela ser variável, preciso declarar a minha variável com um valor bem alto, para naum dar a mensagem que enviei anteriormente, por isto, estou perguntando até quanto eu posso colocar o tamanho na declaração da minha variável.

Fábio, eu já tinha observado este manual mas ele naum tem o que eu preciso.

To precisando da mesma coisa =D

eu to colocando um imenso arquivo em bytes na memoria, a principio ele vai normalmente, mas quando preciso acessar determinado indice na string da um erro.

Eu acho que é por que eu uso o metodo substring que é necessario passar 2 inteiros, mas no meu caso eu preciso passar dois longs, como faço para contornar este problema ?

ja tentei usar String, StringBuffer e StringBuilder. Como o colega falou ali que o limite é de 10^9 eu acho que o problema é o inteiro mesmo.

alguma ideia.

abraço.

Pessoal, eu me deparei também com um problema parecido: Na empresa onde trabalho, desenvolvi uma aplicação que, em dado momento, recebe uma sequência de bytes via Socket. O problema é que essa String pode ter um tamanho indefinido, de forma que, durante os testes, quanto estava recebendo uma sequência de 22 megas, ocorreu o erro “Java Heap Space”.
A única solução que encontrei no momento foi reformatar os comandos que eu enviava via socket para poder enviar a informação parcialmente. À medida que vou recebendo, concateno-a em um arquivo temporário e depois faço o processamento devido. Dessa forma a aplicação funcionou perfeitamente, mas achei o impacto na regra dos comandos indesejado.
A solução está fechada na empresa e não a modificarei mais. No entanto, tive uma idéia para melhorar tal situação:
1- Uma classe que possui um array de bytes para acumular informação recebida. Quando o tamanho dessa informação atingir um máximo (bufferSize), os bytes mais antigos começam a ser acumulados em um arquivo temporário, enquanto os últimos bufferSize bytes são mantidos em memória. Eu comecei a implementar a idéia da seguinte forma: a instância tem dois estados: writeMode e readMode. writeMode é o estado inicial e, a partir do momento que os bytes começam a ser lidos da instância, readMode é ativado e não é mais permitido acumular nenhum byte. Para ler dados acumulados na instância, há o método getBytes(), que retorna um array de bytes de tamanho máximo bufferSize (são necessárias chamadas consecutivas a este método caso o arquivo temporário tenha sido criado, até ser atingido o fim de arquivo), getString() que retorna os bytes no formato String, encodados no Charset padrão ou no informado na construção da instância (segue a mesma regra de chamadas consecutivas de getBytes()) e, por fim, o método saveFile, que esvazia o buffer restante, acumulando toda a informação no arquivo temporário, e depois o renomeia para o arquivo passado por parâmetro.
2 - Uma classe extendida de BufferedOutputStream, que possui métodos para ler a informação recebida pelo OutputStream informado na construção da instância e acumulá-la em um objeto da classe descrita no item 1. A princípio, implementei o método readLine(), que retorna um objeto da classe 1.

Estou postando isso para saber se vocês acham uma boa solução, se já existe alguma outra melhor ou se alguém tem uma idéia melhor. Sou iniciante no java e ainda não conheço todos os recursos da linguagem. Caso a solução seja boa, eu posso disponibilizar o código após terminá-lo.